前端与Node.js | 青训营笔记

14 阅读1分钟

这是我参与第五届青训营伴学笔记创作活动的第五天

浏览器事件循环

同步任务栈-> 微任务队列 -> 宏任务队列

在执行完一个宏任务后,会重新检查一下微任务队列,若有,则继续清空。

Node 事件循环

上一份经典的图

大致的node事件循环顺序

外部输入数据-->轮询阶段(poll)-->检查阶段(check)-->关闭事件回调阶段(close callback)-->定时器检测阶段(timer)-->I/O事件回调阶段(I/O callbacks)-->闲置阶段(idle, prepare)-->轮询阶段(按照该顺序反复运行)

各个阶段做的事

  • timers 阶段:这个阶段执行timer(setTimeout、setInterval)的回调

  • I/O callbacks 阶段:处理一些上一轮循环中的少数未执行的 I/O 回调

  • idle, prepare 阶段:仅node内部使用(我们不用关心)

  • poll 阶段:获取新的I/O事件, 适当的条件下node将阻塞在这里

  • check 阶段:执行 setImmediate() 的回调

  • close callbacks 阶段:执行 socket 的 close 事件回调

同步任务栈-> 微任务队列 -> 宏任务队列

似乎node 10 以前的版本是执行完一队宏任务队列后才会去检测微任务,但是node 10 版本以后也变得跟浏览器一样,执行完一个宏任务后就去检测微任务