setimmediate不是微任务,优先级低于所有微任务,在事件循环check阶段执行,需等待当前宏任务、全部微任务及poll阶段完成后才运行。

setImmediate 在 Node.js 中不是微任务,它的优先级比所有微任务都低。
它在事件循环 check 阶段执行
setImmediate 回调被注册到事件循环的 check 阶段。这个阶段紧接在 poll 阶段之后——只有当 poll 阶段完全结束(包括所有待处理的 I/O 回调执行完毕、且队列为空)后,事件循环才会进入 check 阶段,并执行其中排队的 setImmediate 回调。
这意味着:
- 它不会插队到当前宏任务中间
- 它不参与微任务清空流程
- 即使写在同步代码末尾,也要等当前宏任务 + 所有微任务 + poll 阶段完成后才执行
它明确低于所有微任务
微任务(如 process.nextTick、Promise.then、queueMicrotask)都在当前宏任务结束后立即执行,且按队列顺序全部清空。setImmediate 属于宏任务,排在微任务之后、下一轮事件循环的 check 阶段开始时执行。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
典型执行顺序(同一轮):
- 同步代码
- process.nextTick(最高优先级微任务)
- Promise.then / queueMicrotask(次高)
- setImmediate(要等到 poll 结束才轮到)
和 setTimeout(0) 的关系
两者都是宏任务,但所处阶段不同:
- setTimeout(0) 注册在 timer 阶段,理论上更早触发
- setImmediate 注册在 check 阶段,必须等 poll 阶段收尾
所以,在 I/O 回调里调用时,setImmediate 总是先于 setTimeout(0);但在主模块顶层,执行顺序不确定(取决于事件循环进入 timer 阶段还是 poll 阶段的时机)。
它不适合替代微任务
如果你需要“立刻响应但不打断当前逻辑”,比如错误透传或状态同步,应该用 process.nextTick 或 Promise.resolve().then();setImmediate 更适合“让出线程、等 I/O 处理完再干活”的场景,比如分片处理长任务、避免阻塞网络请求。










