以前總結過瀏覽器中的事件循環,在 Node.js 中也有本身的事件循環,但與瀏覽器不同,在 Node.js 中有 5 個宏任務隊列,分別是:瀏覽器
- 計時器隊列,裏面存放 setTimeout 和 setInterval 函數添加的回調
- 系統相關回調隊列,例如端口監聽、進程資源佔用
- IO 事件隊列,裏面存放 I/O 事件回調,這是 Node.js 異步非阻塞的關鍵
- 當即執行隊列,裏面存放 setImmediate 函數添加的回調
- 關閉操做隊列,裏面存放 close 事件處理回調
除了上面 5 個宏任務隊列,還有 2 個微任務隊列,分別是:異步
- nextTick 回調隊列,即便用 process.nextTick() 函數添加的回調
- 其餘微任務隊列,列如 Promise、queueMicrotask 等
幾個注意點:函數
- 在 NodeJS 中不止一個隊列,不一樣類型的事件在它們本身的隊列中入隊。
- 每一個宏任務階段在清空該階段的任務以後,在移向下一個階段以前,都要去清空兩個微任務隊列
- nextTick 微任務隊列優先級最高,先清空 nextTick 回調隊列再清空其餘微任務隊列
- 清空其餘微任務隊列以後,還要再檢查一遍 nextTick 回調隊列,確保其已被清空
圖示以下:post