┌───────────────────────┐
┌─>│ timers │<————— 執行 setTimeout()、setInterval() 的回調
│ └──────────┬────────────┘
| |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
│ ┌──────────┴────────────┐
│ │ pending callbacks │<————— 執行由上一個 Tick 延遲下來的 I/O 回調(待完善,可忽略)
│ └──────────┬────────────┘
| |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
│ ┌──────────┴────────────┐
│ │ idle, prepare │<————— 內部調用(可忽略)
│ └──────────┬────────────┘
| |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
| | ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │ - (執行幾乎所有的回調,除了 close callbacks 以及 timers 調度的回調和 setImmediate() 調度的回調,在恰當的時機將會阻塞在此階段)
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ | | |
| | └───────────────┘
| |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
| ┌──────────┴────────────┐
│ │ check │<————— setImmediate() 的回調將會在這個階段執行
│ └──────────┬────────────┘
| |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
│ ┌──────────┴────────────┐
└──┤ close callbacks │<————— socket.on('close', ...)
└───────────────────────┘
先執行所有類型爲 timers 的 MacroTask,然後執行所有的 MicroTask(注意 NextTick 要優先哦);
進入 poll 階段,執行幾乎所有 MacroTask,然後執行所有的 MicroTask;
再執行所有類型爲 check 的 MacroTask,然後執行所有的 MicroTask;
再執行所有類型爲 close callbacks 的 MacroTask,然後執行所有的 MicroTask;
至此,完成一個 Tick,回到 timers 階段;
……
如此反覆,無窮無盡……