NodeJS定时器与事件循环

一直以为事件循环是一个独立于NodeJS主线程的单独工作线程,其实并非如此;
事件循环是在NodeJS主线程中完成的;


NodeJS提供四种定时器

为了协调异步任务,使任务按时间顺序执行,NodeJS提供了四种定时器;

  • setTimeout()
  • setInterval()
  • setImmediate()
  • process.nextTick()

其中setTimeoutsetInterval存在于JS语言标准,
setImmediateprocess.nextTick则为NodeJS独有;

任务的执行顺序

  • 同步任务先于异步任务执行
  • 本轮循环先于次轮循环执行

本轮事件循环

本轮循环中存在两个队列:

  1. nextTick队列(nextTickQueue)
  2. 微任务队列(microTaskQueue)

在本轮循环中process.nextTick是优先执行的,所有的nextTick定时器执行完成后,
才轮到微任务队列定时器执行,常见的Promise就属于微任务定时器;

次轮事件循环

事件循环的六个阶段:

  1. timers阶段: 处理setTimeout、setInterval的回调函数
  2. i/o callback阶段: 处理除setTimeout、setInterval、setImmediate、close callback以外的回调函数
  3. idle、prepare阶段: 供LibUV内部使用
  4. poll阶段: 等待未返回的IO事件,直到返回结果
  5. check阶段: 处理setImmediate的回调函数
  6. close callback阶段: 处理关闭事件的回调,如socket.on(‘close’)