Node.js 微任务:process.nextTick 与 Promise
区分微任务(Microtask)与宏任务(Macrotask),掌握它们在事件循环中的执行时机。 · 难度:入门 · +15XP
微任务 vs 宏任务
在 Node.js 中,任务分为两类:微任务(Microtask)和宏任务(Macrotask)。微任务在每个宏任务阶段完成后立即执行,优先级高于下一个宏任务。
微任务队列
process.nextTick回调(最高优先级)- Promise 的
.then()/.catch()/.finally()回调
执行顺序示例
console.log('1');
setTimeout(() => {
console.log('2 (宏任务)');
}, 0);
Promise.resolve().then(() => {
console.log('3 (微任务)');
});
process.nextTick(() => {
console.log('4 (微任务 nextTick)');
});
console.log('5');
// 输出:1, 5, 4, 3, 2
// 注意:nextTick 优先于 Promise.then
微任务递归风险
如果在微任务中不断创建新的微任务(例如递归调用 process.nextTick),会阻塞事件循环,导致 I/O 回调永远无法执行。
function loop() {
process.nextTick(loop); // 永远卡在微任务阶段
}
loop();
setTimeout(() => {
console.log('永远不会执行');
}, 1000);
练习提示
在右侧代码中,添加一个 setImmediate 和一个 Promise,观察它们与 process.nextTick 的执行顺序。尝试在 nextTick 回调中再次调用 nextTick,看看是否会影响后续宏任务。