node 事件循环
# node 事件循环
# node 事件循环过程
- 定时器阶段(Timers)
执行已经被 setTimeout() 和 setInterval() 的调度回调函数
此阶段会判断是否存在过期的计时器回调(包含 setTimeout 和 setInterval),如果存在则会执行所有过期的计时器回调,执行完毕后,如果回调中触发了相应的微任务,会接着执行所有微任务,执行完微任务后再进入 Pending callbacks 阶段。
- 待定回调阶段 (Pending callbacks)
执行延迟到下一个循环迭代的 I/O 回调。
idle, prepare:仅系统内部使用
轮询
当回调队列不为空时:
会执行回调,若回调中触发了相应的微任务,这里的微任务执行时机和其他地方有所不同,不会等到所有回调执行完毕后才执行,而是针对每一个回调执行完毕后,就执行相应微任务。执行完所有的回到后,变为下面的情况。
当回调队列为空时(没有回调或所有回调执行完毕):
但如果存在有计时器(setTimeout、setInterval 和 setImmediate)没有执行,会结束轮询阶段,进入 Check 阶段。否则会阻塞并等待任何正在执行的 I/O 操作完成,并马上执行相应的回调,直到所有回调执行完毕。
- 检测
会检查是否存在 setImmediate 相关的回调,如果存在则执行所有回调,执行完毕后,如果回调中触发了相应的微任务,会接着执行所有微任务,执行完微任务后再进入 Close callbacks 阶段。
- 关闭的回调函数
执行一些关闭的回调函数,如:socket.on('close', ...)。
参考: https://www.cnblogs.com/onepixel/p/7143769.html (opens new window) https://www.cnblogs.com/onepixel/p/7143769.html (opens new window)
node 官网事件循环: https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/ (opens new window)