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