嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

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

日歷

鏈接

個人資料

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

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 国产精品青草久久| 亚洲国产乱码最新视频| 国产精品国产三级国产普通话蜜臀 | 欧美精品播放| 欧美久久九九| 国产精品国产精品| 国产日韩一区| 在线观看亚洲一区| 亚洲高清一二三区| 日韩午夜三级在线| 亚洲欧美在线看| 久久中文在线| 亚洲精品黄网在线观看| 亚洲欧美中文日韩在线| 久久精品伊人| 欧美极品在线观看| 国产视频一区在线| 日韩视频―中文字幕| 欧美一级在线亚洲天堂| 亚洲第一成人在线| 亚洲欧美日韩精品久久奇米色影视| 久久精品官网| 国产精品视频精品视频| 亚洲看片一区| 两个人的视频www国产精品| 欧美激情一区| 欧美一区影院| 欧美日韩另类字幕中文| 狠狠色综合日日| 亚洲欧美在线播放| 亚洲日本视频| 免费欧美在线| 国产一区二区三区不卡在线观看| 亚洲精品在线免费观看视频| 久久精品成人欧美大片古装| 亚洲精品黄色| 欧美高清视频| 国外成人性视频| 午夜精品视频| av72成人在线| 欧美国产在线观看| 亚洲国产欧美日韩| 久热精品在线视频| 欧美伊人久久| 国产亚洲欧美激情| 欧美在线视屏| 小嫩嫩精品导航| 国产精品视频免费观看www| 亚洲伦理在线| 亚洲电影有码| 麻豆成人91精品二区三区| 国产午夜精品理论片a级探花| 亚洲一区二区视频在线观看| 亚洲黄色在线视频| 欧美成人影音| 99国产精品| 亚洲人成网站在线观看播放| 欧美国产第一页| 日韩视频一区二区三区在线播放 | 国产专区欧美专区| 欧美在线视频免费播放| 亚洲欧美资源在线| 国产亚洲欧美激情| 免费影视亚洲| 另类国产ts人妖高潮视频| 亚洲大片av| 亚洲欧洲午夜| 国产精品草莓在线免费观看| 亚洲欧美一区二区三区在线 | 欧美激情一区二区三区全黄| 久久一二三国产| 亚洲精品一区在线观看香蕉| 亚洲国产成人精品视频| 欧美激情综合| 午夜精品久久久久| 久久99在线观看| 亚洲成人在线网| 亚洲国产欧美日韩精品| 欧美日韩在线播放一区二区| 香蕉久久国产| 久久精品五月| 美乳少妇欧美精品| 久久婷婷国产综合精品青草| 国语精品中文字幕| 欧美成在线视频| 欧美日本不卡视频| 欧美在线观看一区二区| 久久人人爽人人爽| 妖精视频成人观看www| 亚洲图色在线| 亚洲精品免费看| 午夜精品久久久久久久蜜桃app | 欧美日韩国产一区二区| 午夜精品在线观看| 久久青青草原一区二区| 亚洲午夜国产一区99re久久| 久久久久久久久蜜桃| av成人国产| 欧美制服丝袜第一页| 一本色道婷婷久久欧美| 久久精品国产清自在天天线| 日韩亚洲在线观看| 欧美一级播放| 亚洲自拍偷拍福利| 美女黄网久久| 久久人人97超碰精品888| 欧美日韩另类一区| 欧美福利视频一区| 国产午夜精品在线观看| 亚洲免费大片| 亚洲精品自在久久| 久久青草欧美一区二区三区| 久久成人在线| 国产精品乱码一区二三区小蝌蚪| 牛牛精品成人免费视频| 国产精品一区二区欧美| 亚洲美女免费精品视频在线观看| 亚洲第一福利视频| 香蕉乱码成人久久天堂爱免费| 艳妇臀荡乳欲伦亚洲一区| 久久久久久午夜| 久久精品亚洲一区| 国产精品免费网站| 99国产精品久久久| 99视频在线精品国自产拍免费观看| 久久精品中文字幕免费mv| 欧美一区二区三区在线观看| 欧美日韩一区在线观看视频| 亚洲人成艺术| 一本久道久久久| 欧美日韩国产成人在线| 最近中文字幕日韩精品| 亚洲激情在线视频| 毛片一区二区| 亚洲国产综合91精品麻豆| 亚洲人午夜精品免费| 免费日韩视频| 亚洲国产欧美一区二区三区久久| 亚洲激情在线| 欧美日韩成人一区二区| 亚洲精品免费在线播放| 亚洲无人区一区| 国产精品www994| 小处雏高清一区二区三区| 亚洲激情婷婷| 一区二区三区久久精品| 欧美性做爰毛片| 亚洲欧美精品suv| 欧美影院视频| 国产一区二区三区免费在线观看| 欧美一区亚洲一区| 女人色偷偷aa久久天堂| 亚洲国产精品va在看黑人| 美女视频网站黄色亚洲| 亚洲人成人一区二区三区| 亚洲一区二区高清| 国产欧美一区二区三区在线老狼 | 亚洲调教视频在线观看| 午夜在线观看欧美| 狠狠噜噜久久| 欧美激情久久久| 亚洲一区二区成人在线观看| 久久国产精品99精品国产| 1024国产精品| 欧美人体xx| 欧美在线亚洲一区| 欧美激情精品久久久久久| 亚洲一级在线观看| 亚洲大片在线观看| 国产精品视频免费| 欧美激情综合网| 欧美中文字幕| 国产精品99久久久久久宅男| 欧美成人精品h版在线观看| 亚洲一级二级| 亚洲精品美女91| 国产欧美一区二区三区在线老狼| 欧美国产国产综合| 久久精品99久久香蕉国产色戒| 亚洲精品一二区| 欧美a级片网| 欧美亚洲免费电影| 日韩午夜av电影| 精品91在线| 国产伦精品一区二区三区视频黑人 | 欧美mv日韩mv国产网站| 亚洲自拍电影| 99在线精品视频| 在线观看欧美视频| 国产精品网曝门| 欧美日韩在线观看视频| 欧美成年人网站| 久久婷婷国产综合尤物精品| 欧美一区二区三区成人| av不卡在线观看| 亚洲黄色大片| 免费在线看一区| 久久久久久久97| 欧美在线不卡视频| 亚洲欧美激情视频|