面试题答案
一键面试timers 阶段
- 功能:这个阶段会执行
setTimeout()
和setInterval()
设定的回调函数。Node.js 会检查是否有到期的定时器,如果有,就将对应的回调函数放入这个阶段的执行队列中执行。
I/O callbacks 阶段
- 功能:执行几乎所有的 I/O 回调,除了
close
事件的回调、setTimeout()
和setInterval()
设定的回调,以及setImmediate()
设定的回调。比如读取文件完成后的回调等会在此阶段执行。
idle, prepare 阶段
- 功能:
idle
和prepare
这两个阶段主要是 Node.js 内部使用,开发者一般不需要直接关注。idle
用于 Node.js 内部一些准备工作,prepare
为下一个poll
阶段做准备。
poll 阶段
- 功能:这是事件循环中非常重要的阶段。如果没有设定定时器,事件循环将在此阶段等待新的 I/O 事件,一旦有新的 I/O 事件到来,其回调函数会被立即执行。如果有定时器到期,事件循环将暂停
poll
阶段,进入timers
阶段执行到期的定时器回调。
check 阶段
- 功能:此阶段会执行
setImmediate()
设定的回调函数。setImmediate()
会将回调函数放入这个阶段的队列中,在下一轮事件循环时执行。
close callbacks 阶段
- 功能:执行一些关闭相关的回调函数,比如
socket.on('close', ...)
的回调。
在实际开发中,数据库查询的回调通常会在 I/O callbacks
阶段处理,因为数据库查询本质上也是一种 I/O 操作,当数据库查询完成后,其回调函数会被放入 I/O callbacks
队列等待执行。