以前总结过浏览器中的事件循环,在 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 回调队列,确保其已被清空
图示以下:post