Nodejs 的事件循环



事件循环是在主线程上完成的。事件循环会无限次地执行,一轮又一轮。只有异步任务的回调函数队列清空了,才会停止执行。每一轮的事件循环,分成六个阶段。这些阶段会依次执行。
  1. timers
  2. pending callbacks 执行已经准备好的 I/O 回调
  3. idle, prepare 仅系统内部使用
  4. poll,用于轮询还未返回的 I/O 事件,必要时进行阻塞 // 所以事件循环不会占用所有 CPU 时间片
  5. check,执行 setImmediate() 的回调函数
  6. close callbacks,执行关闭请求的回调函数

process.nextTick 并不属于事件循环中的某一个阶段,无论事件循环的当前阶段如何,都将在同步操作完成后处理 nextTickQueue。

Node 11 及以后,微任务的处理和浏览器等一样。// 与在哪个事件循环阶段无关
setTimeout(()=>{
console.log('timer1')
Promise.resolve().then(function() {
console.log('promise1')
})
}, 0)
setTimeout(()=>{
console.log('timer2')
Promise.resolve().then(function() {
console.log('promise2')
})
}, 0)
// node 11 以前输出:
// timer1
// timer2
// promise1
// promise2