面试题答案
一键面试- timers阶段:
- 这个阶段会执行
setTimeout()
和setInterval()
设定的回调函数。Node.js会检查定时器队列中到期的定时器(根据其设定的延迟时间,当到达或超过设定延迟时间时),并将它们的回调函数推到这个阶段的执行队列中执行。例如,如果设置了setTimeout(() => { console.log('Timer callback'); }, 1000);
,当经过1000毫秒后,这个回调函数会在timers阶段被执行。
- 这个阶段会执行
- I/O callbacks阶段:
- 执行几乎所有的I/O回调。这里主要处理一些上一轮循环中遗留的一些I/O操作的回调,比如TCP连接错误等。例如,当一个TCP连接尝试失败,相应的错误处理回调可能会在这个阶段执行。不过不包括
close
事件的回调、setTimeout()
和setInterval()
的回调以及setImmediate()
的回调。
- 执行几乎所有的I/O回调。这里主要处理一些上一轮循环中遗留的一些I/O操作的回调,比如TCP连接错误等。例如,当一个TCP连接尝试失败,相应的错误处理回调可能会在这个阶段执行。不过不包括
- idle, prepare阶段:
idle
和prepare
这两个阶段主要是Node.js内部使用的,用户代码通常不会直接与之交互。idle
阶段主要用于一些内部的清理工作。prepare
阶段则为下一个poll
阶段做一些准备工作,例如调整事件循环的状态等。
- poll阶段:
- 这个阶段是事件循环中非常重要的一个阶段。它有两个主要功能:
- 如果轮询队列不为空,事件循环会同步地执行队列中的回调函数,直到队列清空或者达到系统限制。例如,读取文件操作完成后,文件读取的回调函数可能会在这个阶段执行。
- 如果轮询队列为空,并且有已到期的定时器,事件循环会回到
timers
阶段执行定时器的回调。如果没有已到期的定时器,事件循环可能会等待新的I/O事件进入队列(阻塞等待,直到有新的I/O事件到来或者有已到期的定时器)。
- 这个阶段是事件循环中非常重要的一个阶段。它有两个主要功能:
- check阶段:
- 此阶段会执行
setImmediate()
设定的回调函数。setImmediate()
的回调函数会被放入一个专门的队列中,在poll
阶段空闲且队列为空时,事件循环会进入check
阶段,执行这个队列中的回调函数。例如,setImmediate(() => { console.log('Set Immediate callback'); });
,这个回调函数会在check
阶段执行。
- 此阶段会执行
- close callbacks阶段:
- 执行一些关闭的回调函数,例如
socket.on('close', () => { console.log('Socket closed'); });
这样的close
事件回调函数会在这个阶段执行。这里处理的是一些与连接或资源关闭相关的操作回调。
- 执行一些关闭的回调函数,例如