node.js宏任务严格按事件循环六个阶段执行:timers、pending callbacks、idle/prepare、poll、check、close callbacks,各阶段处理特定来源任务,顺序固定不可跳过;微任务如process.nexttick和promise.then在阶段切换间执行,且nexttick优先级更高。

Node.js 的宏任务不是按“类型”粗略分类,而是严格绑定在事件循环的六个阶段中执行。每个阶段只处理特定来源的宏任务,顺序固定、不可跳过。
Node.js 事件循环的六个宏任务阶段
Node.js 的事件循环分为明确的六个阶段,每个阶段对应一类宏任务:
-
Timers(定时器阶段):执行已到期的
setTimeout和setInterval回调 - Pending Callbacks(待定回调阶段):执行某些系统操作(如 TCP 错误)的延迟回调
- Idle / Prepare(空闲/准备阶段):仅内部使用,一般不涉及用户代码
-
Poll(轮询阶段):获取 I/O 事件回调(如文件读取、网络响应);若队列为空且有
setImmediate待执行,则可能提前退出进入下一阶段 -
Check(检查阶段):专门执行
setImmediate回调 -
Close Callbacks(关闭回调阶段):执行
socket.on('close')等资源关闭回调
关键区分点:阶段决定执行时机,而非任务名
同一个 API 在不同上下文中可能落入不同阶段:
-
setTimeout(fn, 0)总是在 Timers 阶段执行,哪怕延时为 0,也要等当前阶段完成再排队 -
setImmediate(fn)总是在 Check 阶段执行,它不看时间,只等 Poll 阶段结束 - I/O 回调(如
fs.readFile完成后)一定在 Poll 阶段,除非被setImmediate提前打断
微任务会插在阶段切换之间
注意:process.nextTick() 和 Promise.then() 这类微任务,不是宏任务,也不属于上述任一阶段。它们在每个阶段结束后、进入下一阶段前立即执行,且 process.nextTick 优先级高于 Promise 微任务。
如何验证阶段行为?
可借助以下典型组合观察执行顺序:
- 先
setTimeout(..., 0),再setImmediate(...):通常setImmediate先于setTimeout执行(因 Timers 在 Check 之前,但首次循环中 Poll 可能快速清空并进入 Check) - 在
fs.readFile回调里同时调用setTimeout(..., 0)和setImmediate(...):setImmediate一定在本轮 Check 阶段执行,而setTimeout要等到下一轮 Timers 阶段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











