前言
JS事件循环机制参照我上一篇JS Event Loop事件循环机制,本文将会讲述 Node 的事件循环机制,便于理解与浏览器的 Event Loop 的差异。
Node 事件循环机制
上图各个阶段说明:
- timers(定时器检测阶段):执行 timer 的回调,即 setTimeout、setInterval 里面的回调函数。
- pending callbacks(I/O事件回调阶段):处理上一轮循环中没有执行的 I/O 回调。
- idle,prepare(闲置阶段):仅 node 内部使用。
- poll(轮询阶段):检查新的 I/O 事件,执行相关回调,适当条件下 Node将阻塞在此。
- check(检查阶段):执行 setImmediate() 回调函数。
- close callback(关闭事件回调阶段):一些关闭的回调函数。如 socket.on()。
poll 执行流程
如果存在定时器,且定时器时间到了,eventloop 回到 timers 阶段。
如果没有定时器,检查 poll 的回调函数队列:不为空,则遍历执行直到队列为空或者达到系统显示。为空,则检查是否有 setImmediate 回调,有则进入 check 阶段执行回调,没有则等待回调加入队列立即执行。超时自动进入 check 阶段。
timers 阶段不管有几个 setTimeout、setInterval 都会执行。
node 与浏览器 eventloop 的差异
浏览器中微任务的队列是每个宏任务执行完之后执行。
node 中的微任务会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕就会去执行微任务队列里面的任务。