node.js 的事件循环中,宏任务与微任务的执行顺序差异在于:微任务在当前阶段所有同步代码及该阶段已排队的宏任务执行完毕后、进入下一阶段前统一清空;而宏任务则是每次只执行一个,执行完后立即检查并执行微任务队列。这意味着在 node.js 中,微任务具有更高的优先级,会在宏任务切换阶段前被优先处理。

Node.js 事件循环各阶段中宏任务的执行时机是什么
Node.js 的事件循环分为多个阶段,每个阶段负责执行特定类型的宏任务。例如,timers 阶段执行 setTimeout 和 setInterval 的回调,I/O callbacks 阶段处理一些系统操作的回调,idle/prepare 阶段仅供内部使用,poll 阶段是最核心的阶段,既处理 I/O 回调也处理新的定时器,check 阶段执行 setImmediate 的回调,close callbacks 阶段处理关闭事件的回调。每个阶段都有一个宏任务队列,当事件循环进入某个阶段时,会依次执行该阶段队列中的所有宏任务,直到队列为空或达到最大执行次数限制。

const fs = require('fs');
console.log('Start');
setTimeout(() => {
console.log('Timer callback');
}, 0);
setImmediate(() => {
console.log('Immediate callback');
});
fs.readFile('/etc/passwd', () => {
console.log('File read callback');
});
console.log('End');
在上述代码中,输出顺序为 Start、End、File read callback(假设文件读取很快)、Timer callback、Immediate callback。这是因为 readFile 的回调属于 I/O callbacks 阶段,会在 poll 阶段执行;setTimeout 的回调在 timers 阶段执行;setImmediate 的回调在 check 阶段执行。由于文件读取是异步操作,其回调可能在 timers 和 check 阶段之前执行,具体取决于系统负载和文件读取速度。但通常情况下,timer 阶段的回调会在 check 阶段之前执行。
Node.js 事件循环中微任务队列的处理时机是什么
在 Node.js 中,微任务主要包括 process.nextTick 和 Promise 的 then/catch/finally 回调。process.nextTick 的回调会在当前阶段的所有同步代码执行完毕后、进入下一个阶段之前执行,且优先级高于 Promise 的微任务。Promise 的微任务则会在当前阶段的所有宏任务和 process.nextTick 回调执行完毕后执行。这种设计确保了 process.nextTick 能够尽快执行,常用于需要立即处理某些逻辑的场景。

console.log('Start');
Promise.resolve().then(() => {
console.log('Promise microtask');
});
process.nextTick(() => {
console.log('NextTick microtask');
});
setTimeout(() => {
console.log('Timer macrotask');
}, 0);
console.log('End');
在上述代码中,输出顺序为 Start、NextTick microtask、Promise microtask、End、Timer macrotask。这是因为 process.nextTick 的回调在当前阶段的所有同步代码执行完毕后立即执行,优先级高于 Promise 的微任务。Promise 的微任务则在 process.nextTick 回调执行完毕后执行。setTimeout 的回调属于宏任务,会在下一个事件循环阶段执行。
当 process.nextTick 和 Promise 同时存在时,它们的执行顺序如何确定
当 process.nextTick 和 Promise 同时存在时,process.nextTick 的回调会先于 Promise 的微任务执行。这是因为 process.nextTick 的优先级高于 Promise 的微任务。具体来说,在当前阶段的所有同步代码执行完毕后,事件循环会先执行 process.nextTick 队列中的所有回调,然后再执行 Promise 的微任务队列。这种设计确保了 process.nextTick 能够尽快执行,适用于需要立即处理某些逻辑的场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











