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

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

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

日歷

鏈接

個人資料

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

存檔

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

        • 国产精品xvideos88| 欧美日韩一视频区二区| 亚洲一区二区毛片| 日韩视频精品在线| 亚洲毛片在线观看.| 欧美大色视频| 亚洲国产欧美日韩| 亚洲第一福利在线观看| 伊人久久综合97精品| 一区二区自拍| 91久久国产综合久久91精品网站| 在线观看91精品国产麻豆| 91久久午夜| 久久午夜视频| 久久精品国产免费观看| 久久青草欧美一区二区三区| 欧美成人一区在线| 日韩天堂av| 欧美一级片一区| 久久精品综合| 欧美精品国产精品日韩精品| 国产精品久久久久久久久久久久| 欧美黄色日本| 亚洲大胆人体在线| 一级成人国产| 午夜精品久久| 免费久久99精品国产自在现线| 亚洲福利视频网站| 亚洲网友自拍| 老牛影视一区二区三区| 欧美视频在线一区二区三区| 国产欧美日韩不卡免费| 亚洲国产欧美一区二区三区久久| 夜夜夜久久久| 久久久久久自在自线| 亚洲国产另类久久久精品极度| av成人动漫| 久久精品日韩一区二区三区| 欧美精品激情在线| 国产亚洲精久久久久久| 日韩午夜av在线| 欧美一区二区三区视频免费播放| 欧美国产91| 亚洲一区二区三区激情| 美腿丝袜亚洲色图| 国产精品美女久久福利网站| 亚洲第一在线综合网站| 亚洲欧美美女| 欧美激情精品久久久久久变态 | 久久精品国产欧美激情| 亚洲高清不卡一区| 性色一区二区| 欧美精品日日鲁夜夜添| 国产精品一区一区三区| 亚洲国产日韩一级| 欧美影院午夜播放| 亚洲精品资源| 久久久久欧美精品| 国产精品九九| 日韩视频二区| 久久久国产91| 亚洲网站在线观看| 欧美精品videossex性护士| 国内一区二区三区在线视频| 亚洲一二三四区| 亚洲二区在线观看| 久久国产一区二区| 国产精品网站在线| 亚洲视频免费在线| 欧美激情女人20p| 欧美在线一二三| 免费观看久久久4p| 亚洲资源av| 亚洲国产精品精华液网站| 欧美一区二区在线播放| 蜜桃av一区二区在线观看| 午夜日韩视频| 亚洲综合首页| 国模 一区 二区 三区| 午夜在线不卡| 亚洲视频免费在线| 久久av红桃一区二区小说| 久久国产黑丝| 欧美视频中文字幕在线| 亚洲精品免费在线播放| 欧美一区二区三区视频免费播放 | 久久综合九色综合欧美就去吻| 亚洲一区二区三区精品在线观看| 国产一区99| 欧美日韩国产123区| 久久精品国产精品亚洲| 国产精品久久久久毛片软件| 久久疯狂做爰流白浆xx| 国内精品国产成人| 欧美日韩美女在线| 欧美精品在线视频| 欧美在线一区二区| 一本大道久久a久久精二百| 国产精品久久久久久久久久直播| 久久久久国产一区二区三区| 久久精品91| 亚洲婷婷国产精品电影人久久| 韩国三级在线一区| 欧美午夜精品久久久久免费视| 亚洲国产婷婷香蕉久久久久久99 | 欧美剧在线观看| 久久阴道视频| 激情欧美国产欧美| 国产精品一区二区在线观看| 狠色狠色综合久久| 伊人久久综合| 国产精品私拍pans大尺度在线| 中文高清一区| 国产一区av在线| 黄色日韩网站| 日韩一区二区高清| 久久精品国产免费看久久精品| 久久久久久久久久看片| 夜夜嗨av一区二区三区四季av| 欧美日韩在线电影| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美精品99| 在线视频精品一区| 99这里只有精品| 久久人人爽国产| 久久高清国产| 久久久一区二区| 欧美一区2区三区4区公司二百| 亚洲桃花岛网站| 一区二区久久久久| 亚洲在线电影| 欧美在线高清| 亚洲欧美一区二区原创| 欧美高清视频一区二区三区在线观看 | 99在线精品免费视频九九视| 99伊人成综合| 欧美www视频| 国产欧美一区二区三区沐欲 | 日韩视频久久| 亚洲欧美韩国| 99精品国产一区二区青青牛奶| 亚洲毛片播放| 午夜伦欧美伦电影理论片| 性欧美video另类hd性玩具| 猫咪成人在线观看| 有坂深雪在线一区| 久久精品欧洲| 国产欧美一区二区三区久久人妖| 欧美国产亚洲精品久久久8v| 亚洲欧美日韩视频一区| 激情自拍一区| 久久天天躁狠狠躁夜夜av| 亚洲女人天堂av| 国产美女精品免费电影| 99精品99| 免费久久久一本精品久久区| 蜜臀va亚洲va欧美va天堂| 狂野欧美激情性xxxx| 国产欧美精品| 久久久久免费视频| 久久精品国产亚洲5555| 国内精品久久久久影院色| 毛片基地黄久久久久久天堂| 午夜精品www| 亚洲精品影视| 狠狠综合久久av一区二区老牛| 亚洲免费精彩视频| 亚洲高清网站| 久久影视精品| 亚洲大片免费看| 欧美一区二区在线免费观看 | 在线日韩av片| 亚洲激情视频在线| 欧美在现视频| 欧美a级理论片| 久久精品国产99国产精品| 欧美国产国产综合| 久久久亚洲综合| 国产精品国产三级国产普通话99| 久久精品亚洲一区二区| 久久国产精品一区二区三区| 亚洲一区二区三区中文字幕| 快she精品国产999| 久久久久国产精品人| 欧美性猛交99久久久久99按摩| 欧美国产日本在线| 久久久水蜜桃| 国产精品xxxav免费视频| 欧美福利在线| 一区二区三区自拍| 午夜精品一区二区三区在线视| 亚洲视频免费在线| 欧美大片免费观看在线观看网站推荐| 久久精品国产99国产精品| 欧美日韩在线三区| 欧美大胆成人| 狠狠色丁香婷婷综合| 亚洲摸下面视频| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品国产三级国产专播精品人|