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,這也就又生成了一次微任務。

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

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

日歷

鏈接

個人資料

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

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
久久精品国产99国产精品| 成人影院天天5g天天爽无毒影院| 奇米精品一区二区三区在线观看一| 第四色在线一区二区| 97精品国产97久久久久久免费| 久热国产在线| 69影院欧美专区视频| 米奇精品一区二区三区| 久草中文在线| 欧美亚洲一区二区三区四区| 精品午夜一区二区三区| 欧美电影免费网站| 日韩欧美成人激情| 美女毛片一区二区三区四区| 国产ts人妖一区二区三区| 在线国产精品播放| 久久综合狠狠综合久久综青草| 成人区精品一区二区婷婷| 国产一区二区网址| 一区二区三区美女视频| 国产精品456露脸| 日韩在线视频导航| 毛片精品免费在线观看| 国产精品久久久久蜜臀| 精品欧美一区二区三区久久久| 国产欧美一区二区| 国产精品亚洲欧美导航| 第四色日韩影片| 色小子综合网| 久久av在线| 国产亚洲精品美女久久久| 97精品一区二区| 国内精品久久久久伊人av| 91在线视频免费看| 99久久精品无码一区二区毛片| 精品国模在线视频| 成午夜精品一区二区三区软件| 777精品视频| 成人在线资源网址| 中文字幕伦理免费在线视频| 91久久精品日日躁夜夜躁国产| 国产福利一区在线观看| 神马久久桃色视频| 成人午夜小视频| 五月婷婷综合在线| 精品产国自在拍| 日韩国产精品久久久久久亚洲| 秋霞国产午夜精品免费视频| 国产精品一区二区三区免费观看| 欧美日韩精品欧美日韩精品一| 欧美精品videosex极品1| 欧美激情一区二区三区高清视频| 色爱综合区网| 欧美激情a在线| 国产精品―色哟哟| 欧美日韩中文字幕一区二区| 国产精品视频免费一区| 精品国产乱码久久久久酒店| 国产有色视频色综合| 亚洲精品一区久久久久久| 八戒八戒神马在线电影| 91精品国产91久久综合| 国产黄色精品网站| 国产大片在线免费观看| 精品国产一区二区三区麻豆免费观看完整版| 国产国语videosex另类| 欧美人与拘性视交免费看| 亚洲视频在线免费观看| 中文字幕亚洲欧美日韩高清| 一区二区三区中文字幕电影| 国产91精品一区二区麻豆网站| 91蜜臀精品国产自偷在线| 国产小视频国产精品| 精品不卡一区二区三区| 亚洲最好看的视频| 欧美伊人亚洲伊人色综合动图| 亚洲精品亚洲人成人网| 一本一道久久a久久精品| 国产一区二区三区免费| 欧美亚男人的天堂| 国产福利不卡| 色乱码一区二区三在线看| 久久久久久艹| 久久不见久久见中文字幕免费| 就去色蜜桃综合| xxxxx日韩| 97久久精品在线| 欧美精品一区三区在线观看| 精品国产一区二区三区不卡蜜臂| 制服丝袜亚洲色图| 四虎884aa成人精品最新| 亚洲最大在线视频| 亚洲小说欧美另类婷婷| 亚洲国产高清自拍| 女同性一区二区三区人了人一| 日本高清在线观看| 午夜精品久久久久久99热| 秋霞电影网一区二区| 色域天天综合网| 奇米影视777在线欧美电影观看| 欧美激情一区二区三级高清视频| 一区二区三区四区日韩| 伦理中文字幕亚洲| 国产精品第10页| 亚洲综合小说区| 久久资源中文字幕| 亚洲精品**中文毛片| xxxxx成人.com| 国产精品日产欧美久久久久| 日韩美女一区二区三区在线观看| 午夜一区二区三区在线观看| 亚洲日本在线天堂| 夜色77av精品影院| 最近2019免费中文字幕视频三| 香蕉视频在线播放| 久久伊人色综合| 狠狠狠色丁香婷婷综合激情| 欧美激情一区二区三区蜜桃视频| 欧美三级日韩三级| 第一福利在线视频| 国产91丝袜在线观看| 亚洲尤物精选| 亚洲一区二区三区小说| 无需播放器亚洲| 亚洲永久免费| 天堂av一区| 99久久夜色精品国产亚洲狼| 久久精品久久99精品久久| 99热国内精品永久免费观看| 91一区二区三区在线播放| 香蕉久久一区二区不卡无毒影院| 青娱乐精品视频| 午夜小视频在线观看| 69国产精品成人在线播放| 免费污视频在线观看| 香港成人在线视频| 在线看国产一区| 色偷偷偷亚洲综合网另类| 国产一区二区精品在线| 欧美丝袜美女中出在线| 亚洲精品极品| 国产91免费观看| 这里只有精品视频在线观看| 欧美在线日韩| tube8在线hd| 亚洲欧美色婷婷| 久久精品国产亚洲高清剧情介绍| 欧美中文字幕精品| 制服丝袜中文字幕亚洲| 久久久91精品国产一区不卡| 亚洲影视中文字幕| 欧美aa国产视频| 色狠狠综合天天综合综合| 欧美男男freegayvideosroom| 亚洲欧美在线看| 国产成人精品亚洲精品| 国产日韩精品视频一区| 99九九99九九九视频精品| 久久精品视频在线免费观看| 日本天堂在线观看| 亚洲裸体俱乐部裸体舞表演av| 成人国产精品视频| 欧美日韩另类一区| 麻豆视频免费在线观看|