MST

星途 面试题库

面试题:Node.js事件循环机制中各阶段的主要作用是什么

请详细阐述Node.js事件循环中timers、I/O callbacks、idle, prepare、poll、check、close callbacks这几个阶段分别主要执行什么任务。
14.5万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

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