小编典典

事件循环上下文中微任务和宏任务之间的区别

all

我刚刚阅读完 Promises/A+ 规范并偶然发现了 microtask 和 macrotask
术语:参见http://promisesaplus.com/#notes

我以前从未听说过这些术语,现在我很好奇有什么区别?

我已经尝试在网上找到一些信息,但我发现的只是 w3.org 档案中的这篇文章(它没有向我解释其中的区别): http:
//lists.w3.org/Archives /Public/public-
nextweb/2013Jul/0018.html

此外,我还发现了一个名为“macrotask”的 npm
模块:https
://www.npmjs.org/package/macrotask 同样,它没有明确区别到底是什么。

我所知道的是,它与事件循环有关,如https://html.spec.whatwg.org/multipage/webappapis.html#task-
queue
https://html.spec.whatwg中所述.org/multipage/webappapis.html#perform-a-
microtask-
checkpoint

鉴于此 WHATWG 规范,我知道理论上我应该能够自己提取差异。但我确信其他人也可以从专家的简短解释中受益。


阅读 62

收藏
2022-06-11

共1个答案

小编典典

事件循环的一次复飞将从 宏任务队列* 中处理 一个 任务(该队列在WHATWG
规范
中简称为
任务队列 )。在这个宏任务完成后,所有可用 的微
任务都将被处理,即在同一个复飞周期内。在处理这些微任务时,它们可以将更多微任务排队,这些微任务将全部运行,直到微任务队列耗尽。

__
***

这样做的实际后果是什么?

如果一个 微任务 递归地排队其他微任务,可能需要很长时间才能处理下一个宏任务。这意味着,您最终可能会遇到一个阻塞的
UI,或者您的应用程序中的一些已完成的 I/O 空闲。

然而,至少关于 Node.js 的 process.nextTick 函数(它对 microtasks 进行排队),通过
process.maxTickDepth 可以防止这种阻塞。此值设置为默认值 1000,在达到此限制后减少对微任务的进一步处理,从而允许处理下一个
任务

那么什么时候用呢?

基本上, 您需要以同步方式异步执行任务时(即,当您说 在最近的将来执行此(微)任务时)使用微任务 。否则,坚持使用
macrotasks

例子

宏任务:
setTimeoutsetIntervalsetImmediaterequestAnimationFrameI/O、UI
渲染
微任务: process.nextTickPromisesqueueMicrotaskMutationObserver

2022-06-11