Node.js 的事件循环由六个主要阶段组成,每个阶段都有一个或多个回调队列。事件循环依次遍历这些阶段,并在每个阶段执行相应的回调函数。具体的流程如下:
-
Timers(计时器阶段):
- 执行已到期的
setTimeout
和setInterval
回调。这里的计时器并不保证会在精确的时间执行,只会在接近的时间执行。
- 执行已到期的
-
I/O Callbacks(I/O 回调阶段):
- 执行几乎所有的回调(除了关闭的回调函数、计时器的回调函数和
setImmediate
的回调函数)。这包括一些操作系统层面的回调,如网络通信的回调。
- 执行几乎所有的回调(除了关闭的回调函数、计时器的回调函数和
-
Idle, Prepare(空闲,准备阶段):
- 仅在内部使用。一般不涉及开发者的代码。用于 node.js 内部调用。
-
Poll(轮询阶段):
-
计算轮询的超时时间。
-
处理轮询队列中的事件。
- 检索新的 I/O 事件,执行 I/O 回调(几乎所有的 I/O 都在这里进行),在适当的时候回阻塞在这里。轮询阶段有两个主要功能:
-
-
Check(检查阶段):
- 执行
setImmediate
回调函数。setImmediate
与setTimeout
的区别在于,setImmediate
设计为在当前轮询阶段结束后立即执行,而setTimeout
则需要等到下一个计时器阶段。
- 执行
-
Close Callbacks(关闭回调阶段):
- 执行一些关闭回调函数,如
socket.on('close', ...)
。
- 执行一些关闭回调函数,如