Node.js中的事件循环

758 阅读1分钟

之前总结过浏览器中的事件循环,在 Node.js 中也有自己的事件循环,但与浏览器不一样,在 Node.js 中有 5 个宏任务队列,分别是:

  1. 计时器队列,里面存放 setTimeout 和 setInterval 函数添加的回调
  2. 系统相关回调队列,例如端口监听、进程资源占用
  3. IO 事件队列,里面存放 I/O 事件回调,这是 Node.js 异步非阻塞的关键
  4. 立即执行队列,里面存放 setImmediate 函数添加的回调
  5. 关闭操作队列,里面存放 close 事件处理回调

除了上面 5 个宏任务队列,还有 2 个微任务队列,分别是:

  1. nextTick 回调队列,即使用 process.nextTick() 函数添加的回调
  2. 其他微任务队列,列如 Promise、queueMicrotask 等

几个注意点:

  • 在 NodeJS 中不止一个队列,不同类型的事件在它们自己的队列中入队。
  • 每个宏任务阶段在清空该阶段的任务之后,在移向下一个阶段之前,都要去清空两个微任务队列
  • nextTick 微任务队列优先级最高,先清空 nextTick 回调队列再清空其他微任务队列
  • 清空其他微任务队列之后,还要再检查一遍 nextTick 回调队列,确保其已被清空

图示如下:

Node.js事件环