美文网首页
[译] 事件循环中microtask和macrotask的不同之

[译] 事件循环中microtask和macrotask的不同之

作者: d6e83ee69161 | 来源:发表于2017-03-23 00:58 被阅读201次

原文地址: Difference between microtask and macrotask within an event loop context

问:

我刚刚读完了Promises/A+规范,但被microtask 和 macrotask这两个名词给困扰到了: 详情见http://promisesaplus.com/#notes

我之前从来没听过这些名词,现在我很好奇它们之间到底有什么区别?

我已经尽我所能的在网上搜罗了一些信息,但只找到了w3.org归档中的一篇文章(但里面没有解释俩名词之间的不同点):http://lists.w3.org/Archives/Public/public-nextweb/2013Jul/0018.html

另外,我发现了一个npm模块,名字就叫做"macrotask": https://www.npmjs.org/package/macrotask .但可惜的是,它并没有说清楚不同之处到底是什么.

我所能了解到的只是,它们与事件循环有关,如https://html.spec.whatwg.org/multipage/webappapis.html#task-queuehttps://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint中所述.

我知道我理论上能通过WHATWG规范凭自己找到它们的不同点.但我确信假如有这方面的专家能给出一个简短的解释,那么其他人肯定也会从中受益良多.

高票回答1:

一轮事件循环将只会精确的执行一个来自macrotask队列的任务(这个队列在[WHATWG 规范]中被简称为task 队列(https://html.spec.whatwg.org/multipage/webappapis.html#task-queue)).

当该macrotask完成后,所有可用的microtasks 都将被执行,即在同一轮循环内.当这些microtasks都被处理完后,它们可能会将更多的microtasks加入到队列中去,这些任务将会依次执行,直到microtask队列为空.

那么这种情况的实际结果到底是什么样呢?

如果一个microtask递归地将其它microtasks加入队列,这将会导致下一个macrotask需要等待很久才能执行.这意味着,你的程序可能会因为一个被阻塞的UI或者一些已完成但空置的I/O被告以结束.

但是,至少Node.js的process.nextTick函数(负责对microtasks进行排队),有一套内建的保护机制,可以通过设置process.maxTickDepth来防止类似的阻塞行为.该值默认为1000,一旦到达该值,那么超出该限制外的一切microtasks处理行为将会被切断,这样就可以处理下一个macrotask了.

所以何时使用它们?

通常,当你需要以同步的方式做一些异步的事情时(i.e. 当你想在一旦完成该(micro-)task就执行某些代码的时候).

否则的话,继续使用macrotasks.

具体分类:
macrotasks: setTimeout, setInterval, setImmediate, I/O, UI 渲染

microtasks: process.nextTick, Promises(注:浏览器原生Promise), Object.observe, MutationObserver

相关文章

网友评论

      本文标题:[译] 事件循环中microtask和macrotask的不同之

      本文链接:https://www.haomeiwen.com/subject/vkzlnttx.html