92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

Promise 你真的用明白了么?

2020-9-2    seo達人

前置知識

在開始正文前,我們先把本文涉及到的一些內容提前定個基調。

Promise 哪些 API 涉及了微任務?

Promise 中只有涉及到狀態變更后才需要被執行的回調才算是微任務,比如說 then、 catch 、finally ,其他所有的代碼執行都是宏任務(同步執行)。

上圖中藍色為同步執行,黃色為異步執行(丟到微任務隊列中)。

這些微任務何時被加入微任務隊列?

這個問題我們根據 ecma 規范來看:

  • 如果此時 Promise 狀態為 pending,那么成功或失敗的回調會分別被加入至 [[PromiseFulfillReactions]] 和 [[PromiseRejectReactions]] 中。如果你看過手寫 Promise 的代碼的話,應該能發現有兩個數組存儲這些回調函數。
  • 如果此時 Promise 狀態為非 pending 時,回調會成為 Promise Jobs,也就是微任務。

了解完以上知識后,正片開始。

同一個 then,不同的微任務執行

初級

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
    });
  })
  .then(() => { console.log("then2");
  });

以上代碼大家應該都能得出正確的答案:then1 → then1-1 → then2。

雖然 then 是同步執行,并且狀態也已經變更。但這并不代表每次遇到 then 時我們都需要把它的回調丟入微任務隊列中,而是等待 then 的回調執行完畢后再根據情況執行對應操作。

基于此,我們可以得出第一個結論:鏈式調用中,只有前一個 then 的回調執行完畢后,跟著的 then 中的回調才會被加入至微任務隊列。

中級

大家都知道了 Promise resolve 后,跟著的 then 中的回調會馬上進入微任務隊列。

那么以下代碼你認為的輸出會是什么?

let p = Promise.resolve();

p.then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
  });
}).then(() => { console.log("then1-2");
});

p.then(() => { console.log("then2");
}); 

按照一開始的認知我們不難得出 then2 會在 then1-1 后輸出,但是實際情況卻是相反的。

基于此我們得出第二個結論:每個鏈式調用的開端會首先依次進入微任務隊列。

接下來我們換個寫法:

let p = Promise.resolve().then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
  });
}).then(() => { console.log("then2");
});

p.then(() => { console.log("then3");
});

上述代碼其實有個陷阱,then 每次都會返回一個新的 Promise,此時的 p 已經不是 Promise.resolve() 生成的,而是最后一個 then 生成的,因此 then3 應該是在 then2 后打印出來的。

順便我們也可以把之前得出的結論優化為:同一個 Promise 的每個鏈式調用的開端會首先依次進入微任務隊列。

高級

以下大家可以猜猜 then1-2 會在何時打印出來?

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve()
      .then(() => { console.log("then1-1"); return 1;
      })
      .then(() => { console.log("then1-2");
      });
  })
  .then(() => { console.log("then2");
  })
  .then(() => { console.log("then3");
  })
  .then(() => { console.log("then4");
  });

這題肯定是簡單的,記住第一個結論就能得出答案,以下是解析:

  • 第一次 resolve 后第一個 then 的回調進入微任務隊列并執行,打印 then1
  • 第二次 resolve 后內部第一個 then 的回調進入微任務隊列,此時外部第一個 then 的回調全部執行完畢,需要將外部的第二個 then 回調也插入微任務隊列。
  • 執行微任務,打印 then1-1 和 then2,然后分別再將之后 then 中的回調插入微任務隊列
  • 執行微任務,打印 then1-2 和 then3 ,之后的內容就不一一說明了

接下來我們把 return 1 修改一下,結果可就大不相同啦:

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve()
      .then(() => { console.log("then1-1"); return Promise.resolve();
      })
      .then(() => { console.log("then1-2");
      });
  })
  .then(() => { console.log("then2");
  })
  .then(() => { console.log("then3");
  })
  .then(() => { console.log("then4");
  });

當我們 return Promise.resolve() 時,你猜猜 then1-2 會何時打印了?

答案是最后一個才被打印出來。

為什么在 then 中分別 return 不同的東西,微任務的執行順序竟有如此大的變化?以下是筆者的解析。

PS:then 返回一個新的 Promise,并且會用這個 Promise 去 resolve 返回值,這個概念需要大家先了解一下。

根據 Promise A+ 規范

根據規范 2.3.2,如果 resolve 了一個 Promise,需要為其加上一個 then 并 resolve。

if (x instanceof MyPromise) { if (x.currentState === PENDING) {
  } else {
    x.then(resolve, reject);
  } return;
}

上述代碼節選自手寫 Promise 實現。

那么根據 A+ 規范來說,如果我們在 then 中返回了 Promise.resolve 的話會多入隊一次微任務,但是這個結論還是與實際不符的,因此我們還需要尋找其他權威的文檔。

根據 ECMA - 262 規范

根據規范 25.6.1.3.2,當 Promise resolve 了一個 Promise 時,會產生一個NewPromiseResolveThenableJob,這是屬于 Promise Jobs 中的一種,也就是微任務。

This Job uses the supplied thenable and its then method to resolve the given promise. This process must take place as a Job to ensure that the evaluation of the then method occurs after evaluation of any surrounding code has completed.

并且該 Jobs 還會調用一次 then 函數來 resolve Promise,這也就又生成了一次微任務。

這就是為什么會觸發兩次微任務的來源。

藍藍設計www.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://www.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
久久久亚洲精品视频| 97av在线视频免费播放| 日韩成人av一区| 欧美激情一区二区三级高清视频| 国产91在线播放九色快色| 韩国三级日本三级少妇99| 在线视频国产日韩| 久久免费视频在线观看| 97在线观看视频国产| 国产丝袜精品视频| 7m精品福利视频导航| 日本精品一区二区三区在线播放视频| 欧美激情一区二区三区在线视频观看| 国产成人中文字幕| 中文字幕av一区二区三区谷原希美| 欧美裸体xxxx极品少妇软件| 宅男66日本亚洲欧美视频| 中文字幕日韩电影| 亚洲一区二区精品| 精品偷拍一区二区三区在线看| 亚洲欧美日本精品| 国产福利精品av综合导导航| 91精品视频一区| 精品视频偷偷看在线观看| 久久久成人精品| 欧美亚洲免费电影| 最近2019中文字幕第三页视频| 久久91亚洲精品中文字幕| 国产精品久久久久久久久借妻| 欧美裸身视频免费观看| 成人有码在线播放| 久久精品中文字幕一区| 国产精品久久9| 亚洲人成网站在线播| 欧美日韩国产中文精品字幕自在自线| 992tv成人免费视频| 久久亚洲国产成人| 国产男女猛烈无遮挡91| 久久成人18免费网站| 日韩欧美亚洲范冰冰与中字| 日韩av影片在线观看| 亚洲18私人小影院| 丁香五六月婷婷久久激情| 色综合久久天天综线观看| 亚洲欧美日韩爽爽影院| 成人福利视频在线观看| 成人黄色影片在线| 亚洲国产精品人人爽夜夜爽| 亚洲欧美日韩成人| 国产情人节一区| 亚洲第一中文字幕在线观看| 78m国产成人精品视频| 久久亚洲精品成人| 欧美大片大片在线播放| 国产69精品久久久久9| 亚洲一区中文字幕| 欧美国产亚洲视频| 亚洲精品在线观看www| 91免费看国产| 人妖精品videosex性欧美| 2019中文字幕在线免费观看| 成人av资源在线播放| 亚洲美女又黄又爽在线观看| 亚洲国产精品中文| 国产精品久久久久aaaa九色| 高清亚洲成在人网站天堂| 久久韩剧网电视剧| 久久中文精品视频| 久久99热精品这里久久精品| 色yeye香蕉凹凸一区二区av| 国产亚洲精品久久久久久| 亚洲天堂男人天堂女人天堂| 日韩在线激情视频| 久久99国产精品久久久久久久久| 国产精品久久久久久亚洲调教| 国外色69视频在线观看| 黑人精品xxx一区| 国产亚洲精品久久久久动| 成人a免费视频| 国产精品日韩久久久久| 91免费福利视频| 亚洲色图狂野欧美| 日韩欧美aⅴ综合网站发布| 国产精品福利小视频| 91中文在线观看| 亚洲成人免费在线视频| 国产日韩欧美中文| 国产精品三级美女白浆呻吟| 日韩av观看网址| 久久久国产一区| 欧美日韩在线观看视频| 久久久久久久久久久免费| 最新69国产成人精品视频免费| 欧美性黄网官网| 欧美日韩亚洲一区二区| 国产日韩在线看片| 亚洲资源在线看| 久久99热精品这里久久精品| 成人情趣片在线观看免费| 91精品久久久久久久久不口人| 日韩av在线影院| 日韩亚洲欧美中文在线| 国产精品久久久久久久久久ktv| 精品久久久av| 国产日韩欧美一二三区| 久久久久久久久综合| 中文字幕亚洲专区| 久久久久久一区二区三区| 色小说视频一区| 一级做a爰片久久毛片美女图片| 88国产精品欧美一区二区三区| 色狠狠久久aa北条麻妃| 成人黄色片网站| www日韩中文字幕在线看| 亚洲丁香久久久| 精品高清美女精品国产区| 26uuu日韩精品一区二区| 久久婷婷国产麻豆91天堂| 亚洲91精品在线| 亚洲天堂第二页| 亚洲成人精品视频在线观看| 欧美日韩国产在线播放| 精品亚洲一区二区三区| 欧洲亚洲免费在线| 欧美一区第一页| 亚洲欧美成人精品| 国产在线精品播放| 亚洲成人黄色网| 欧美日韩国产区| 亚洲bt欧美bt日本bt| 精品女厕一区二区三区| 国产精品黄色影片导航在线观看| 91最新国产视频| 国产第一区电影| 亚洲精品白浆高清久久久久久| 国产精品99久久99久久久二8| 中文字幕日韩欧美在线视频| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲在线免费视频| 欧美自拍大量在线观看| 日韩精品福利在线| 久久精品男人天堂| 欧美日韩亚洲激情| 欧美日韩亚洲精品内裤| 亚洲网站视频福利| 中文字幕久久亚洲| 亚洲女人被黑人巨大进入al| 成人免费看吃奶视频网站| 成人精品一区二区三区| 国产精品激情av电影在线观看| 九九精品视频在线| www.日韩免费| 狠狠躁夜夜躁人人躁婷婷91| 91亚洲国产精品| 97精品在线视频| 欧美午夜激情小视频| 2019中文在线观看| 日韩电影第一页| 久久精品亚洲94久久精品| 精品国产自在精品国产浪潮| 欧美床上激情在线观看| 欧美老肥婆性猛交视频| 日韩精品视频中文在线观看| 欧美在线性视频|