最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中Promise的執(zhí)行順序詳解

 更新時(shí)間:2022年01月26日 10:30:50   作者:自然醒  
Promise 是 JS 中進(jìn)行異步編程的新的解決方案(舊的是純回調(diào)形式) ,下面這篇文章主要給大家介紹了關(guān)于JavaScript中Promise執(zhí)行順序的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

最近看到一個 Promise 相關(guān)的很有意思的代碼:

new Promise((resolve) => {
  console.log(1)
  resolve()
}).then(() => {
  new Promise((resolve) => {
    console.log(2)
    resolve()
  }).then(() => {
    console.log(4)
  })
}).then(() => {
  console.log(3)
})

第一次看到這個代碼的時(shí)候,以為的輸出結(jié)果會是:1,2,3,4,但是被實(shí)際的輸出結(jié)果打臉 。

如圖所示,實(shí)際的輸出結(jié)果為:1,2,4,3。

代碼分析

為了搞清楚實(shí)際的輸出結(jié)果為什么是:1,2,4,3,我們來一步步分析代碼的執(zhí)行。

我們知道,Promise 實(shí)例化時(shí),傳入的回調(diào)會立即執(zhí)行,而Promise 的 then 回調(diào)會被放到微任務(wù)隊(duì)列中,等待執(zhí)行。隊(duì)列就是一個先進(jìn)先出的列表,先被放到隊(duì)列的回調(diào),會被優(yōu)先執(zhí)行。前面的代碼中,一共有 5 個回調(diào)函數(shù)。

回調(diào)1 是 Promise 實(shí)例化時(shí)的回調(diào),所以會立即執(zhí)行,此時(shí)控制臺打印出數(shù)字 1,然后 resolve() 方法被調(diào)用,此時(shí)的 Promise 狀態(tài)被修改成了 fulfilled(如果沒有調(diào)用 resolve() 方法,Promise 的狀態(tài)為 pending)。

Promise 實(shí)例化完成后,第一個 then() 方法被調(diào)用, 回調(diào)2 會被放入了微任務(wù)隊(duì)列中,等待執(zhí)行。

then 方法何時(shí)調(diào)用?

這個時(shí)候疑問點(diǎn)來了,第一個 then() 方法被調(diào)用后,第二個 then 方法會不會馬上被調(diào)用,如果會,那輸出的結(jié)果就應(yīng)該是 :1,2,3,4。顯然,此時(shí)不會馬上調(diào)用第二個 then() 方法,也就是不會馬上將 回調(diào)5 放入微任務(wù)隊(duì)列。那如果不會,那何時(shí)才會被調(diào)用?

這個時(shí)候,需要看一下 Promise/A+ 規(guī)范。重點(diǎn)是下面幾條:

2.2 then 方法 promise 的 then 方法接受兩個參數(shù):

promise.then(onFulfilled, onRejected)

2.2.2 如果 onFulfilled 是函數(shù):

  • 2.2.2.1 當(dāng) promise 處于已處理狀態(tài)時(shí),該函數(shù)必須被調(diào)用并將 promise 的值作為第一個參數(shù)。
  • 2.2.2.2 該函數(shù)一定不能在 promise 處于已處理狀態(tài)之前調(diào)用。
  • 2.2.2.3 該函數(shù)被調(diào)用次數(shù)不超過一次。

2.2.6 then 可以在同一個 promise 上多次調(diào)用。

  • 2.2.6.1 如果 promise 處于已處理狀態(tài)時(shí),所有相應(yīng)的 onFulfilled 回調(diào)必須按照它們對 then 的組織順序依次調(diào)用。
  • 2.2.6.2 如果 promise 處于已拒絕狀態(tài)時(shí),所有相應(yīng)的 onRejected 回調(diào)必須按照它們對 then 的組織順序依次調(diào)用。

2.2.7 then 必須返回一個 promise。

promise1 = new Promise(resolve => resolve())

// promise1 可以多次調(diào)用 then
// 且 onFulfilled 回調(diào)的執(zhí)行順序,按照 .then 的調(diào)用順序執(zhí)行
promise1.then(onFulfilled1) // 1
promise1.then(onFulfilled2) // 2
promise1.then(onFulfilled3) // 3
// 上面 3 個 onFulfilled,按照 1、2、3 的順序執(zhí)行
// 調(diào)用 .then 方法后,返回一個新的 promise
promise2 = promise1.then(onFulfilled, onRejected);

綜上,第一個 then() 方法調(diào)用后,會返回一個新的 Promise。這樣做的目的就是為了保持鏈?zhǔn)秸{(diào)用,而且 then() 方法內(nèi)的 onFulfilled 回調(diào)會等待 Promise 狀態(tài)修改之后才會調(diào)用。

我們稍微修改一下前面代碼的調(diào)用形式,如下:

const p1 = new Promise((resolve) => {
? console.log(1)
? resolve()
})

const p2 = p1.then(() => {
? new Promise((resolve) => {
? ? console.log(2)
? ? resolve()
? }).then(() => {
? ? console.log(4)
? })
})

const p3 = p2.then(() => {
? console.log(3)
})

p1.then() 會返回一個新的 Promise 命名為 p2,后面的 p2.then() 的回調(diào)會在 p1.then() 內(nèi)的回調(diào)函數(shù)執(zhí)行完之后,才會調(diào)用,也就是 p2 這個 Promise 狀態(tài)發(fā)生改變之后。

所以,只有 回調(diào)2 執(zhí)行完成后,才會執(zhí)行 p2.then()。我們再看 回調(diào)2 的內(nèi)容。

回調(diào)2 先是對一個 Promise 進(jìn)行了實(shí)例化操作,實(shí)例化的回調(diào)為 回調(diào)3 ,該回調(diào)會立即執(zhí)行,此時(shí)控制臺打印出數(shù)字 2,然后 resolve() 方法被調(diào)用,此時(shí)的 Promise 狀態(tài)被修改成了 fulfilled,后面的 回調(diào)4 會放入微任務(wù)隊(duì)列。回調(diào)2 執(zhí)行完畢后,執(zhí)行 p2.then(),回調(diào)5 被放入微任務(wù)隊(duì)列。

按照隊(duì)列先進(jìn)先出的執(zhí)行順序,先執(zhí)行 回調(diào)4,然后執(zhí)行 回調(diào)5。所以,在控制臺會先輸出數(shù)字 4,然后輸出數(shù)字 3。

如果想要輸出的結(jié)果為:1,2,3,4,可以將代碼改成如下形式:

const p1 = new Promise((resolve) => {
? console.log(1)
? resolve()
})

p1.then(() => {
? new Promise((resolve) => {
? ? console.log(2)
? ? resolve()
? }).then(() => {
? ? console.log(4)
? })
})

p1.then(() => {
? console.log(3)
})

根據(jù)前面的 2.2.6 規(guī)則,then 可以在同一個 promise 上多次調(diào)用,且 p1 后面的 then 會按照他們的調(diào)用順序直接放入微任務(wù)隊(duì)列中。

總結(jié)

到此這篇關(guān)于JavaScript中Promise執(zhí)行順序的文章就介紹到這了,更多相關(guān)js Promise的執(zhí)行順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 前端解析markdown處理代碼塊高亮并添加復(fù)制功能實(shí)例代碼

    前端解析markdown處理代碼塊高亮并添加復(fù)制功能實(shí)例代碼

    在Markdown中,原生語法并不直接支持文字高亮,不過你可以通過一些擴(kuò)展的Markdown語法或者HTML標(biāo)簽來實(shí)現(xiàn),這一效果這篇文章主要介紹了前端解析markdown處理代碼塊高亮并添加復(fù)制功能的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • JavaScript判斷前綴、后綴是否是空格的方法

    JavaScript判斷前綴、后綴是否是空格的方法

    這篇文章主要介紹了JavaScript判斷前綴、后綴是否是空格的方法,涉及javascript操作字符串的正則替換、判斷與屬性操作技巧,需要的朋友可以參考下
    2015-04-04
  • axios/fetch實(shí)現(xiàn)stream流式請求示例詳解

    axios/fetch實(shí)現(xiàn)stream流式請求示例詳解

    這篇文章主要為大家介紹了axios/fetch實(shí)現(xiàn)stream流式請求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • JavaScript requestAnimationFrame動畫詳解

    JavaScript requestAnimationFrame動畫詳解

    這篇文章主要為大家詳細(xì)介紹了JavaScript requestAnimationFrame動畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • js實(shí)現(xiàn)iGoogleDivDrag模塊拖動層拖動特效的方法

    js實(shí)現(xiàn)iGoogleDivDrag模塊拖動層拖動特效的方法

    這篇文章主要介紹了js實(shí)現(xiàn)iGoogleDivDrag模塊拖動層拖動特效的方法,實(shí)例分析了javascript操作拖動層的技巧,需要的朋友可以參考下
    2015-03-03
  • uniapp使用Vant-weapp的最新方法教程

    uniapp使用Vant-weapp的最新方法教程

    Vant?Weapp是有贊前端團(tuán)隊(duì)開源的一套小程序UI組件庫,助力開發(fā)者快速搭建小程序應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于uniapp使用Vant-weapp的最新方法教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • JavaScript數(shù)組操作總結(jié)

    JavaScript數(shù)組操作總結(jié)

    JavaScript中的Array對象與其他編程語言中的數(shù)組一樣,是一組數(shù)據(jù)的集合。在JavaScript中,數(shù)組里面的數(shù)據(jù)可以是不同類型的,并具有用于執(zhí)行數(shù)組常見操作的方法,本文整理了一些常用的,需要的可以參考一下
    2022-10-10
  • 基于JavaScript實(shí)現(xiàn)輪播圖效果

    基于JavaScript實(shí)現(xiàn)輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • JavaScript原生數(shù)組Array常用方法

    JavaScript原生數(shù)組Array常用方法

    在入門Vue時(shí), 列表渲染一節(jié)中提到數(shù)組的變異方法, 其中包括push(), pop(), shift(), unshift(), splice(), sort(), reverse(), 而concat()和slice()不屬于變異方法. 在這里就復(fù)習(xí)一下Array所提供的這幾個方法的使用
    2017-04-04
  • 如何用前端html實(shí)現(xiàn)2024煙花效果

    如何用前端html實(shí)現(xiàn)2024煙花效果

    這篇文章主要給大家介紹了關(guān)于如何用前端html實(shí)現(xiàn)2024煙花效果的相關(guān)資料,文中介紹的是JavaScript代碼定義了煙花碎片和火箭類,通過動畫循環(huán)模擬煙花爆炸效果,需要的朋友可以參考下
    2024-11-11

最新評論

甘肃省| 抚州市| 抚宁县| 绥中县| 青铜峡市| 辽宁省| 西藏| 勐海县| 祁阳县| 阜南县| 安塞县| 辽阳市| 万源市| 铁岭市| 宁阳县| 毕节市| 湘西| 嘉定区| 当阳市| 陵川县| 忻城县| 湘乡市| 达拉特旗| 沾化县| 喜德县| 马边| 谷城县| 都匀市| 彭山县| 马龙县| 宾阳县| 嘉鱼县| 正阳县| 遂川县| 溧水县| 太康县| 遂平县| 诸城市| 桂东县| 高青县| 喀喇沁旗|