setimmediate在node.js事件循环的check阶段执行,位于poll之后、close callbacks之前;其回调在poll清空后立即进入check阶段执行,而settimeout(0)在timers阶段执行,通常需等待下一轮循环。

setImmediate 在 Node.js 事件循环的 check 阶段 执行。
check 阶段的位置很明确
它位于 poll 阶段之后、close callbacks 阶段之前,是 Node.js 六阶段事件循环中专为 setImmediate 设计的环节:
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
- Timers → Pending I/O → Idle/Prepare → Poll → Check → Close callbacks
- poll 阶段处理完 I/O 回调后,若队列清空且存在 setImmediate 调用,事件循环会立即进入 check 阶段,而非等待或跳转到 timers
- 这个阶段只负责执行 setImmediate 排入的回调,不处理定时器、I/O 或关闭事件
和 setTimeout(0) 的关键区别就在这里
setTimeout(0) 的回调被放入 timers 阶段,而 timers 是下一轮事件循环才可能执行的起点:
- 在 I/O 回调内部调用时,setImmediate 总比 setTimeout(0) 先执行——因为前者落在本轮的 check,后者要等下轮的 timers
- 在主模块顶层调用时,执行顺序可能浮动,但根本原因仍是阶段归属不同:check 和 timers 不在同一次循环迭代中竞争
- 浏览器没有 check 阶段,所以 setImmediate 在浏览器中直接报 ReferenceError
它不是“立刻”,而是“检查之后”
名字有误导性,“Immediate” 指的是在 poll 结束后尽快进入 check 执行,并非跳过所有阶段:
- 如果 poll 阶段正忙(比如大量 I/O 任务排队),setImmediate 回调仍需等 poll 清空才能触发
- 它不插队当前同步代码,也不打断正在运行的回调,只保证排入 check 队列,在该阶段被顺序取出执行
- 与 process.nextTick 不同:nextTick 在当前操作结束后、任何阶段切换前执行,优先级更高










