浏览器和Node事件循环的区别
先看一个简单的事件循环笔试题:
在不同的环境中,输出的结果也是不同的:
接下来我们就看看浏览器和 Node 中时间循环的区别是什么。
浏览器环境下的 异步任务 分为 宏任务(macroTask) 和 微任务(microTask) :
当满足执行条件时, 宏任务(macroTask) 和 微任务(microTask) 会各自被放入对应的队列: 宏队列(Macrotask Queue) 和 微队列(Microtask Queue) 中等待执行。
在 Node 环境中 任务类型 相对就比浏览器环境下要复杂一些:
因此,也就产生了执行事件循环相应的任务队列 Timers Queue 、 I/O Queue 、 Check Queue 和 Close Queue 。
先执行 <script> 中的同步任务,然后所有微任务,一个宏任务,所有微任务,一个宏任务......
需要 注意 的是:
在进入第一次循环之前,会先进行如下操作:
循环中进行的操作:
可以看出, nextTick 优先级比 Promise 等 microTask 高, setTimeout 和 setInterval 优先级比 setImmediate 高。
在整个过程中,需要 注意 的是:
事件循环在 浏览器 和 Node 中的区别很容易被人忽视,执行顺序整理如下:
浏览器环境下:
Node 环境下:
个人觉得比较清晰了,有什么问题可以私信讨论。