99久久精品国产片-99久久精品国产免费-99久久精品国产麻豆-99久久精品国产国产毛片-99久久精品国产高清一区二区-99久久精品费精品国产一区二区

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.lapeinture.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://www.lapeinture.cn

存檔

欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩一级精品视频在线观看| 亚洲精品中文字幕久久久久久| 中文字幕Aⅴ资源网| 国产福利免费观看| 免费一级生活片| 亚洲 国产精品 日韩| 国产不卡高清| 欧美激情中文字幕一区二区| 青青青草影院| 亚洲 男人 天堂| 国产欧美精品午夜在线播放| 一级女性全黄生活片免费| 精品美女| 国产a视频| 中文字幕一区二区三区 精品 | 国产伦久视频免费观看视频| 黄视频网站免费观看| 午夜久久网| 麻豆系列 在线视频| 日日夜夜婷婷| 国产麻豆精品hdvideoss| 久久国产影院| 91麻豆精品国产自产在线| 日韩av成人| 台湾毛片| 精品久久久久久中文| 欧美日本免费| 精品国产一区二区三区久 | 精品国产一区二区三区久久久狼| 麻豆网站在线看| 欧美一级视频免费观看| 国产一区二区精品| 国产伦精品一区二区三区在线观看| 日韩在线观看免费| 国产麻豆精品| 亚飞与亚基在线观看| 成人免费观看的视频黄页| 精品在线观看国产| 免费一级片在线| 一级女性全黄久久生活片| 国产视频一区二区三区四区 | 日韩综合| 欧美大片一区| 国产一区二区精品| 九九久久99| 一本高清在线| 国产精品1024在线永久免费| 欧美一区二区三区在线观看| 一级毛片视频免费| 91麻豆国产级在线| 日日日夜夜操| 九九久久99综合一区二区| a级毛片免费全部播放| 日本在线不卡免费视频一区| 色综合久久天天综合绕观看| 九九热国产视频| 国产视频久久久| 欧美激情一区二区三区在线 | 精品视频一区二区| 国产网站免费| 日韩在线观看视频免费| 国产91素人搭讪系列天堂| 日韩一级黄色片| 国产不卡在线观看视频| 日韩av东京社区男人的天堂| 午夜在线亚洲| 国产一级强片在线观看| 成人高清视频免费观看| 国产美女在线一区二区三区| 久久精品免视看国产成人2021| 日韩中文字幕在线亚洲一区 | 欧美1区| a级黄色毛片免费播放视频| 日日日夜夜操| 你懂的福利视频| 色综合久久天天综合观看| 精品美女| 九九干| 天天色成人| 韩国三级香港三级日本三级| 精品国产一区二区三区久 | 精品视频免费看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久久久久久久综合影视网| 亚洲天堂免费观看| 久久国产影视免费精品| 九九九网站| 欧美激情在线精品video| 欧美激情伊人| 日韩一级黄色| 麻豆系列 在线视频| 精品久久久久久综合网| 精品国产香蕉在线播出| 亚欧视频在线| 999精品视频在线| 欧美另类videosbestsex| 国产极品白嫩美女在线观看看| 中文字幕一区二区三区 精品 | 美女免费黄网站| 成人在免费观看视频国产| 日韩在线观看视频免费| 久久成人亚洲| 亚洲 国产精品 日韩| 欧美α片无限看在线观看免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 免费国产在线视频| 日本在线www| 中文字幕Aⅴ资源网| 毛片高清| 久久成人综合网| 欧美一级视频高清片| 一级女性全黄久久生活片| 欧美大片a一级毛片视频| 欧美激情中文字幕一区二区| 成人影视在线观看| 日本免费乱人伦在线观看| 成人影视在线播放| 99色播| 精品毛片视频| 亚洲女初尝黑人巨高清在线观看| 国产福利免费观看| 久久精品欧美一区二区| 黄色免费网站在线| 日日日夜夜操| 欧美爱色| 999精品在线| 欧美激情中文字幕一区二区| 国产视频久久久| 成人影视在线观看| 亚洲 国产精品 日韩| 91麻豆国产级在线| 一级毛片视频播放| 日韩在线观看免费完整版视频| 99久久精品国产免费| 国产不卡精品一区二区三区| 久久精品成人一区二区三区| 精品国产香蕉在线播出| 999精品视频在线| 99色视频在线观看| 国产精品自拍在线| 欧美a免费| 免费毛片基地| 青青久久国产成人免费网站| 国产一区二区精品| 亚洲第一页色| 国产美女在线观看| 二级特黄绝大片免费视频大片| 黄色免费三级| 久久久久久久网| 国产网站免费| 欧美日本韩国| 亚洲第一色在线| 成人免费观看的视频黄页| 午夜久久网| 成人免费观看网欧美片| 高清一级毛片一本到免费观看| 夜夜操天天爽| 久久99这里只有精品国产| 欧美电影免费看大全| 久久久久久久网| 色综合久久天天综合| 国产视频一区二区三区四区 | 日韩专区在线播放| 国产成人啪精品| 日韩男人天堂| 国产不卡高清| 久久精品免视看国产成人2021| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久国产精品永久免费网站| 日本免费乱理伦片在线观看2018| 亚洲女初尝黑人巨高清在线观看| 欧美电影免费看大全| 中文字幕一区二区三区 精品| 国产亚洲精品aaa大片| 久久国产精品永久免费网站| 精品久久久久久中文字幕一区| 韩国三级视频网站| 久久国产一区二区| 天天做日日爱夜夜爽| 高清一级毛片一本到免费观看| 麻豆系列 在线视频| 免费毛片基地| 精品国产亚洲人成在线| 香蕉视频久久| 日本特黄一级| 欧美1区| 一本高清在线| 韩国毛片| 国产精品123| 午夜激情视频在线播放| 夜夜操天天爽| 成人免费观看网欧美片| 国产不卡在线观看视频| 色综合久久天天综线观看| 色综合久久久久综合体桃花网| 国产成人精品影视| 日韩中文字幕在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品国产香蕉伊思人在线又爽又黄|