node事件循環學習筆記

  • html

    setTimeout(() => console.log(1));
    setImmediate(() => console.log(2));
    process.nextTick(() => console.log(3));
    Promise.resolve().then(() => console.log(4));
    (() => console.log(5))();
    複製代碼

    執行結果:node

    5
    3
    4
    1
    2
    複製代碼

node事件分 同步、異步,因爲JS的單線程原理,異步事件的處理方式依靠 事件循環。canvas

  • 異步事件分爲:微事件/宏事件
  • 微事件包括:
    • process.nextTick
    • Promise.then
  • 宏事件包括:
    • setTimeout/setInterval
    • setImmediate
    • I/O callback

不一樣的異步事件,循環規則也不一樣。bash


宏事件循環

  1. timers階段:setTimeout/setInterval的回調函數執行階段
  2. I/O callbacks階段:未解決的回調執行執行
  3. poll階段:輪詢階段。接受新的I/O回調,並將其加入輪詢列隊中進行先進先出的順序執行。
    • 若該階段事件列隊爲空,檢查check階段是否有事件列隊,有則順序執行。同時也會檢查是否有定時器到達閾值,若是有則循環繞到timers階段時執行。若是沒有其餘異步任務要處理會一直停留在該階段等待 I/O 結果返回。
    • 若該階段的事件列隊不爲空,則將事件列隊中的事件執行完直到爲空,或直到內存溢出
  4. check階段:執行setImmediate()的回調函數
  5. close callbacks:執行關閉請求的回調函數 .on('close', callback)

微事件循環

  1. process.nextTick
  2. Promise.then

在同一次循環中process.nextTick總要比Promise.then先執行異步

循環原則

  • 只有前一個階段的事件隊列所有清空之後,纔會執行下一個階段的事件隊列
  • 進入到下一個階段的事件列隊以前,會先執行微事件列隊直到爲空。
  • 同一次循環中,微事件的執行老是優先於宏事件

事件執行順序:

  1. 同步事件
  2. 發出異步請求
  3. 規劃定時器生效的時間
  4. process.nextTick
  5. Promise.then
  6. 事件循環

圖解

筆者自畫,理解不當之處,敬請糾正,感激涕零 函數

image

終極挑戰

setTimeout(() => {
  process.nextTick(() => {
    console.log(1)
    process.nextTick(() => console.log(2))
  });
  console.log(3)
  setTimeout(() => { console.log(4)})
  setImmediate(() => console.log(5));
});
setTimeout(() => {
  process.nextTick(() => console.log(6));
  Promise.resolve(7).then(res=>console.log(res))
  console.log(8)
});
(() => console.log(9))();
setImmediate(() => console.log(10));
複製代碼

你答對了嗎?oop

9
3
8
1
6
2
7
10
5
4
複製代碼

參考連接

Node 定時器詳解——阮一峯ui

Node.js event loop workflow & lifecycle in low levelspa

相關文章
相關標籤/搜索