浅析 JS 事宜轮回之 Microtask 和 Macrotask

简介

我们在上一篇 《浅析 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 到场也会被实行。

所以我们来看下面的代码:
《浅析 JS 事宜轮回之 Microtask 和 Macrotask》

实行递次是什么?
我们已晓得 setTimeout 是 Macrotask,Promise 是 Microtask,而这段代码从上到下实行也是一个 Macrotask

步骤:

  1. 最先实行,实行剧本作为一个使命进入 Macrotask Queue,同时进入挪用栈实行
  2. Line 1, 输出 script start
  3. Line 3 的 setTimeout 回调进入 Macrotask Queue 守候
  4. Line 7 的回调进入 Microtask Queue 守候
  5. Line 13 输出 script end,此时剧本实行完成(即完成了一个 Macrotask)
  6. 最先实行 Microtask Queue,从中拿出一个放入挪用栈实行
  7. 最先实行 Line 7 的回调,该回调输出 promise1,返回 undefined
  8. Line 9 的回调进入 Microtask Queue,因为 Microtask Queue 没有清空,直接实行该回调,输出 promise2,该回调返回 undefined
  9. Microtask Queue 已清空(此时浏览器能够更新衬着UI),最先将 Macrotask Queue 中使命放入挪用栈实行
  10. 实行 Line 3 的回调,输出 setTimeout,Macrotask Queue 清空
  11. 顺序实行完成

所以打印递次为:

script start -> script end -> promise1 -> promise2 -> setTimeout

PS. 上面的这段代码实行流程,发起看原文的倒数第二篇参考文章,有动态交互操纵能够练习训练。

总结

《浅析 JS 事宜轮回之 Microtask 和 Macrotask》

  1. Microtask 比拟 Macrotask 具有更高的优先级
  2. Macrotask 总是在 JS 代码实行完成而且 Microtask Queue 清空以后实行
  3. JS 代码实行自身也是一个 Macrotask
  4. Microtask Queue 清空后有可能会从新衬着 UI
  5. 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

民众号:码力全开
《浅析 JS 事宜轮回之 Microtask 和 Macrotask》

    原文作者:savokiss
    原文地址: https://segmentfault.com/a/1190000019415672
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞