之前总结过浏览器中的事件循环,在 Node.js 中也有自己的事件循环,但与浏览器不一样,在 Node.js 中有 5 个宏任务队列,分别是:
- 计时器队列,里面存放 setTimeout 和 setInterval 函数添加的回调
- 系统相关回调队列,例如端口监听、进程资源占用
- IO 事件队列,里面存放 I/O 事件回调,这是 Node.js 异步非阻塞的关键
- 立即执行队列,里面存放 setImmediate 函数添加的回调
- 关闭操作队列,里面存放 close 事件处理回调
除了上面 5 个宏任务队列,还有 2 个微任务队列,分别是:
- nextTick 回调队列,即使用 process.nextTick() 函数添加的回调
- 其他微任务队列,列如 Promise、queueMicrotask 等
几个注意点:
- 在 NodeJS 中不止一个队列,不同类型的事件在它们自己的队列中入队。
- 每个宏任务阶段在清空该阶段的任务之后,在移向下一个阶段之前,都要去清空两个微任务队列
- nextTick 微任务队列优先级最高,先清空 nextTick 回调队列再清空其他微任务队列
- 清空其他微任务队列之后,还要再检查一遍 nextTick 回调队列,确保其已被清空
图示如下: