作者:真知棒 | 来源:互联网 | 2023-10-12 09:26
简介我们在上一篇《浅析JS中的EventLoop事宜轮回》中提到一个EventQueue,其实在事宜轮回中queue一共有两种,另有一种叫JobQueue个中EventQueue在
简介
我们在上一篇 《浅析 JS 中的EventLoop 事宜轮回》 中提到一个 Event Queue
,其实在事宜轮回中 queue 一共有两种,另有一种叫 Job Queue
个中
Event Queue
在 HTML 范例中被称为
Task Queue
,然则为了辨别,平常都叫作
Macrotask Queue
Job Queue
是在 ECMAScript 范例中谈及处置惩罚 Promise 回调时提到的,然则因为和 V8 中的完成比较类似,所以平常都称为
Microtask Queue
Macrotask
Macrotasks 包括了剖析 HTML、天生 DOM、实行主线程 JS 代码和其他事宜如 页面加载、输入、收集事宜、定时器事宜等。从浏览器的角度,Macrotask 代表的是一些离散的自力的事情。
罕见运用
setTimeout
, setInterval
, setImmediate
, requestAnimationFrame
, I/O
, UI rendering
Microtask
Microtasks 则是为了完成一些更新运用顺序状况的较小的使命,如处置惩罚 Promise 的回折衷 DOM 的修正,以便让这些使命在浏览器从新衬着之前实行。Microtask 应该以异步的体式格局尽快实行,所以它们的开支比 Macrotask 要小,而且能够使我们在 UI 从新衬着之前实行,避免了不必要的 UI 衬着。
罕见运用
process.nextTick
, Promises
, Object.observe
, MutationObserver
实行递次
Event Loop 的完成须要最少一个 Macrotask Queue 和最少一个 Microtask Queue。为了便于明白,我们都简化成一个。
简朴来讲,Microtask Queue 具有更高的优先级,即实行一个 Macrotask 使命后,就会清空全部 Microtask Queue,此时如果有新的 Microtask 到场也会被实行。
所以我们来看下面的代码:
实行递次是什么?
我们已晓得 setTimeout 是 Macrotask,Promise 是 Microtask,而这段代码从上到下实行也是一个 Macrotask
步骤:
- 最先实行,实行剧本作为一个使命进入 Macrotask Queue,同时进入挪用栈实行
- Line 1, 输出
script start
- Line 3 的 setTimeout 回调进入 Macrotask Queue 守候
- Line 7 的回调进入 Microtask Queue 守候
- Line 13 输出
script end
,此时剧本实行完成(即完成了一个 Macrotask) - 最先实行 Microtask Queue,从中拿出一个放入挪用栈实行
- 最先实行 Line 7 的回调,该回调输出
promise1
,返回 undefined - Line 9 的回调进入 Microtask Queue,因为 Microtask Queue 没有清空,直接实行该回调,输出
promise2
,该回调返回 undefined - Microtask Queue 已清空(此时浏览器能够更新衬着UI),最先将 Macrotask Queue 中使命放入挪用栈实行
- 实行 Line 3 的回调,输出
setTimeout
,Macrotask Queue 清空 - 顺序实行完成
所以打印递次为:
script start -> script end -> promise1 -> promise2 -> setTimeout
PS. 上面的这段代码实行流程,发起看原文的倒数第二篇参考文章,有动态交互操纵能够练习训练。
总结
- Microtask 比拟 Macrotask 具有更高的优先级
- Macrotask 总是在 JS 代码实行完成而且 Microtask Queue 清空以后实行
- JS 代码实行自身也是一个 Macrotask
- Microtask Queue 清空后有可能会从新衬着 UI
- Promise 属于 Microtask,setTimeout 属于 Macrotask
整体的实行递次为:通例代码
-> promises
-> events 和 setTimeout 等
参考文章
原文链接
ECMA262 Job Queues
HTML Standard Task Queue
HTML系列:macrotask和microtask
microtask and macrotask a hands on approach
difference-between-microtask-and-macrotask-within-an-event-loop-context
民众号:码力全开