process.nextTick 优先级高于 setImmediate,它在当前操作结束后立即执行,不属于事件循环任何阶段,而 setImmediate 在下一轮 check 阶段执行;nextTick 可能导致饥饿,应按场景谨慎选用。
在 Node.js 的事件循环中,process.nextTick 的执行优先级高于 setImmediate —— 它们虽都用于“延迟执行”,但触发时机和所处的阶段完全不同。
Node.js 事件循环分为多个阶段(timers、pending callbacks、idle/prepare、poll、check、close callbacks)。process.nextTick 不属于任何阶段,而是在**当前操作完成之后、进入下一个事件循环阶段之前立即执行**;而 setImmediate 被放入 **check 阶段**,即 poll 阶段结束后才运行,属于真正意义上的“下一轮事件循环的早期”。
如果大量递归调用 process.nextTick(如未设退出条件),事件循环将无法进入下一阶段,导致 setImmediate、setTimeout、I/O 回调全部被阻塞 —— 这是典型的“饥饿问题”。而 setImmediate 每次只调度一次,天然受事件循环节制,不会造成这种风险。
Promise.then 回调属于微任务(microtask),与 process.nextTick 同属“当前操作结束后立即执行”的范畴,但 Node.js 中 nextTick 的优先级略高于 Promise 微任务(即 nextTick 回调总在 Promise.then 之前执行);而 setImmediate 是宏任务(macrotask),排在所有微任务之后、下一轮事件循环 check 阶段。
nextTick → Promise.then → setTimeout(0) / setImmediate
queueMicrotask()(Node.js 11+ / 浏览器支持)不要因为 nextTick “更快”就滥用。它的设计初衷是让开发者在当前操作收尾前插入清理或错误处理逻辑(例如在 EventEmitter emit 后立即响应异常),而不是做通用延迟。