process.nextTick 不是微任务,而是 Node.js 独立维护的 nextTickQueue,在每个事件循环阶段结束后立即清空,执行时机早于 Promise.then 等微任务;其回调不进入 V8 微任务队列,而是在当前阶段尾部串行执行,优先级高于所有微任务和宏任务。

process.nextTick 不是微任务,它压根不进微任务队列——而是由 Node.js 单独维护一个 nextTickQueue,在每个事件循环阶段(如 timers、poll、check)执行完回调后立刻清空,时间点早于 V8 引擎处理 Promise.then 等微任务。
它不排队,只插队
标准微任务(Promise.then、queueMicrotask、MutationObserver)由 V8 统一调度,在本轮宏任务结束后批量执行;而 nextTick 回调被 Node.js 运行时直接塞进自己的内部队列,绕开 V8 微任务机制。这个队列不是“排在微任务前面”,而是根本不在同一套调度体系里。
- 哪怕你在 Promise.then 里调用 process.nextTick,新回调仍加入当前阶段的 nextTick 队列尾部,本轮就会执行
- 连续调用 5 次 process.nextTick,它们会串行执行,中间不会插入任何 Promise.then 或 I/O 回调
- 它不是“更快的微任务”,而是“不走微任务通道”的独立通路
执行时机比 Promise.then 明确更早
看这段代码的输出顺序就能验证:
process.nextTick(() => console.log('nextTick'));
Promise.resolve().then(() => console.log('promise'));
console.log('end');
输出恒为:start → end → nextTick → promise。说明:
立即学习“Java免费学习笔记(深入)”;
- 同步代码(start、end)先执行完
- 接着立即清空所有 pending 的 nextTick 回调
- 等 nextTick 队列彻底空了,V8 才开始执行微任务队列里的 Promise.then
和 setImmediate、setTimeout(0) 对比更清楚
setImmediate 属于宏任务,安排在 check 阶段;setTimeout(0) 归属 timers 阶段;而 process.nextTick 可以在 poll 阶段内部任意 I/O 回调之后就执行,甚至在同一个阶段内多次触发。
- 即使 setImmediate 写在 process.nextTick 前面,执行顺序仍是 nextTick 先
- 这种顺序不是竞态或随机,是事件循环各阶段设计决定的硬性规则
- 官方文档也提醒:“nextTick 这个名字有点误导”——它不是“下一个 tick”,而是“当前 tick 尾部的最后干预机会”


















