nodejs定時器和promise執行順序

var wait = function (ms) {
  return new Promise((resolve) => {
    console.log("promise"); //promise的構造函數是同步代碼,立即執行
    setTimeout(() => {
      console.log("resolve"); //宏任務
      resolve();
    }, ms);
  });
};

Promise.resolve().then(() => {
  console.log("mocro"); //微任務
});

setTimeout(() => {
  console.log("timeout"); //宏任務
}, 0);

var delayPrint = async function (ms) {
  console.log("begin");
  await wait(ms);
  console.log("print");
};

delayPrint(0);

//輸出順序
// begin
// promise
// mocro
// timeout
// resolve
// print

nodejs是單線程異步非阻塞任務,這裏單線程指用戶主線程,主線程配合時間循環隊列實現程序運行。

主線程循序執行用戶同步代碼,當遇到定時器時將定時器任務放到事件隊列中,遇到promise將函數放到微任務隊列中。當主線程執行完畢同步代碼後,先檢查是否又微任務,如果有執行,再檢查宏任務,如果有則執行。如果在微任務中編寫定時器任務,也會插入到宏人物中。

需要注意的是:

  1. 無論是宏任務還是微任務,執行主體都是用戶主線程。
  2. 當多個settimout定時事件爲0時,回調函數會根據插入任務隊列順序執行其回調函數。

上述代碼輸出執行順序爲:
// 1. 同步任務 一般程序和promise的構造語句
// 2. 微任務 promise的resolve 和 reject
// 3. 宏人物 定時器等 定時器定時時間一樣時根據建立順序輸出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章