1. 程式人生 > 程式設計 >JS非同步巨集佇列微佇列原理詳解

JS非同步巨集佇列微佇列原理詳解

先看一張我繪製的原理圖

JS非同步巨集佇列微佇列原理詳解

原理圖

setImmediate 也是巨集任務,在 Node 環境下,微任務還有 process.nextTick

JS 中用來儲存待執行回撥函式的佇列包含 2 個不同特定的列隊

  • 巨集列隊:用來儲存待執行的巨集任務(回撥),比如:定時器回撥、DOM 事件回撥、ajax 回撥微
  • 列隊:用來儲存待執行的微任務(回撥),比如:promise的回撥、MutationObserver 的回撥

JS 執行時會區別這 2 個佇列

  • JS 引擎首先必須先執行所有的初始化同步任務程式碼
  • 每次準備取出第一個巨集任務執行前,都要將所有的微任務一個一個取出來執行,也就是優先順序比巨集任務高,且與微任務所處的程式碼位置無關

下面這個例子可以看出 Promise 要先於 setTimeout 執行

setTimeout(() => { // 立即放入巨集佇列
  console.log('settimeout callback1()');
},0);
setTimeout(() => { // 立即放入巨集佇列
  console.log('settimeout callback2()');
},0);


Promise.resolve(1).then(value => { // 立即放入微佇列
  console.log('Promise onResolved1()',value);
})
Promise.resolve(2).then(value => { // 立即放入微佇列
  console.log('Promise onResolved2()',value);
})

// Promise onResolved1() 1
// Promise onResolved2() 2
// settimeout callback1()
// settimeout callback2()

全文完。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。