Node.js的事件循环是其处理非阻塞I/O操作的核心机制,整个循环被划分为多个不同的阶段,每个阶段负责处理特定类型的任务,check阶段就是其中不可或缺的一个环节。

事件循环的阶段顺序概述
Node.js事件循环的执行顺序大致为:定时器阶段(timers)、待定回调阶段(pending callbacks)、空闲/准备阶段(idle, prepare)、轮询阶段(poll)、检查阶段(check)、关闭回调阶段(close callbacks)。check阶段位于轮询阶段之后,在关闭回调阶段之前执行。
check阶段的核心作用
check阶段的主要任务是执行setImmediate回调。setImmediate是Node.js特有的一个定时器方法,它的回调会在当前事件循环的check阶段被执行,而且它的执行时机是在轮询阶段结束之后,比大部分定时器回调的执行时机更靠前。
轮询阶段的主要工作是检索新的I/O事件,执行与I/O相关的回调,如果轮询阶段没有任务要处理,就会检查是否有setImmediate回调需要执行,如果有就会进入check阶段执行这些回调。
check阶段与其他阶段的执行顺序对比
为了更直观理解check阶段的执行顺序,我们可以通过一个包含setTimeout和setImmediate的示例来验证:
// 定时器阶段执行setTimeout回调,check阶段执行setImmediate回调
setTimeout(() => {
console.log('setTimeout回调执行');
}, 0);
setImmediate(() => {
console.log('setImmediate回调执行');
});这个示例的执行结果在大多数情况下会先输出setImmediate回调执行,再输出setTimeout回调执行。因为事件循环启动时,定时器阶段需要等待达到指定的阈值才会执行回调,而setImmediate的回调会在当前循环的check阶段直接执行,不需要等待额外的阈值时间。
不过如果这段代码放在一个I/O循环内部,执行顺序可能会发生变化,因为I/O操作的回调会在轮询阶段执行,之后才会进入check阶段执行setImmediate回调,再进入下一个循环的定时器阶段执行setTimeout回调。
check阶段的注意事项
- setImmediate的回调只在check阶段执行,不同的事件循环中,check阶段的执行时机是固定的,位于轮询阶段之后。
- check阶段的任务执行是同步的,同一个check阶段中的所有setImmediate回调会按照添加的顺序依次执行。
- 如果在check阶段的回调中再次添加setImmediate回调,新的回调会在下一个事件循环的check阶段执行,不会在当前阶段执行。
check阶段的实际应用场景
check阶段适合用来处理那些需要在当前操作完成之后,尽快执行的任务,比如在某些I/O操作完成后,需要立刻做一些后续的处理,就可以把后续逻辑放在setImmediate回调中,确保它会在当前循环的check阶段执行,不会阻塞后续的事件循环流程。
比如在读取文件之后,需要立刻处理文件内容,同时不希望阻塞其他I/O操作的执行,就可以使用setImmediate来包装处理逻辑:
const fs = require('fs');
fs.readFile('./test.txt', 'utf8', (err, data) => {
if (err) {
console.error('读取文件失败', err);
return;
}
// 把后续处理逻辑放在setImmediate中,在check阶段执行
setImmediate(() => {
console.log('处理文件内容:', data);
// 这里可以写具体的文件内容处理逻辑
});
});这样文件读取的回调在轮询阶段执行完成后,就会进入check阶段执行setImmediate中的处理逻辑,既保证了处理及时性,也不会影响事件循环的其他阶段任务执行。
Node.js事件循环check阶段setImmediate修改时间:2026-06-05 02:40:43