setimmediate 是 node.js 事件循环中绑定在 check 阶段的宏任务,执行时机晚于所有微任务(nexttick → promise.then)、早于下一轮 timers,依赖 poll 阶段结束,是 i/o 后立即响应的可靠选择,为 node.js 独有 api。

setImmediate 既不是微任务,也不属于常规宏任务(如 setTimeout),而是 Node.js 事件循环中一个明确绑定在 check 阶段 的宏任务类型。它的调度时机介于微任务清空之后、下一轮 timers 阶段之前,是事件循环六阶段中位置固定、行为可预测的一环。
它不参与微任务队列,但严格晚于所有微任务
Promise.then、queueMicrotask、process.nextTick 等都进入微任务队列,在当前宏任务结束后立即执行,且按注册顺序连续执行。setImmediate 完全不进入这个队列——它的回调被放入独立的 check 阶段队列。因此:
- 无论 Promise.resolve().then() 写在 setImmediate 前还是后,.then 总先执行
- 即使连续调用 10 次 setImmediate,也只会在本轮 check 阶段执行第一个,其余留到后续轮次
- process.nextTick 回调甚至比 Promise.then 更早,所以三者顺序恒为:nextTick → Promise.then → setImmediate
它依赖 poll 阶段结束,但不等待下一轮 timers
setImmediate 的触发前提是 poll 阶段已彻底退出:要么 I/O 回调全部执行完毕,要么队列为空且无 setImmediate 待处理。一旦满足,事件循环立刻进入 check 阶段执行它——而不是等下一轮循环的 timers 阶段。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 在 I/O 回调(如 fs.readFile 的 callback)内同时注册 setImmediate 和 setTimeout(0),输出一定是 setImmediate 先、setTimeout 后
- 但在主模块顶层直接调用两者,顺序可能波动,因为启动时事件循环尚未稳定进入 timers 阶段
- 这种“阶段性绑定”让 setImmediate 成为 I/O 后立即响应 的可靠选择,语义比 setTimeout(0) 更清晰
它适合“让出控制权”,而非“尽快执行”
名字里的 “immediate” 容易误导。它实际含义是“在本轮事件循环的 check 阶段执行”,延迟取决于当前 poll 阶段是否繁忙。相比而言:
- 想 马上响应又不打断当前逻辑 → 用 process.nextTick(但慎防饥饿)
- 想 等微任务走完、I/O 处理完再干活 → setImmediate 是精准匹配
- 想 模拟浏览器 setTimeout(fn, 0) → setImmediate 更贴近语义,但跨环境需用 setTimeout
它和浏览器异步机制没有直接对应物
setImmediate 是 Node.js 独有 API,浏览器中不存在。前端若需类似行为,应理解其本质后做合理映射:
- 语义上最接近 setTimeout(fn, 0),但执行时机更确定(不依赖计时器精度)
- 不能用 Promise.then 替代,因后者是微任务,优先级高得多
- 在跨平台代码中,应避免直接使用,或通过条件判断 + fallback 封装










