这是我参与第五届青训营伴学笔记创作活动的第五天
浏览器事件循环
同步任务栈-> 微任务队列 -> 宏任务队列
在执行完一个宏任务后,会重新检查一下微任务队列,若有,则继续清空。
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 版本以后也变得跟浏览器一样,执行完一个宏任务后就去检测微任务