我刚刚读完 Promises/A+ 规范,并偶然发现了术语 microtask 和 Macrotask:请参阅http://promisesaplus.com/#notes http://promisesaplus.com/#notes
我以前从未听说过这些术语,现在我很好奇它们之间有什么区别?
我已经尝试在网上查找一些信息,但我找到的只是 w3.org Archives 中的这篇文章(它没有向我解释其中的差异):http://lists.w3.org/Archives/Public/public-nextweb/2013Jul/0018.html http://lists.w3.org/Archives/Public/public-nextweb/2013Jul/0018.html
此外,我还发现了一个名为“macrotask”的 npm 模块:https://www.npmjs.org/package/macrotask https://www.npmjs.org/package/macrotask同样,尚不清楚到底有什么区别。
我所知道的是,它与事件循环有关,如中所述https://html.spec.whatwg.org/multipage/webappapis.html#task-queue https://html.spec.whatwg.org/multipage/webappapis.html#task-queue
and https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint
我知道,根据 WHATWG 规范,理论上我应该能够自己提取差异。但我确信其他人也可以从专家给出的简短解释中受益。
事件循环的一圈将会有正好一个正在处理的任务宏任务队列(这个队列简称为任务队列 in the WHATWG 规范 https://html.spec.whatwg.org/multipage/webappapis.html#task-queue)。
该宏任务完成后,所有可用的微任务将被处理,即在同一复飞周期内。当这些微任务被处理时,它们可以将更多的微任务排队,这些微任务将一一运行,直到微任务队列耗尽。
这会产生什么实际后果?
If a 微任务递归地将其他微任务排队,可能需要很长时间才能处理下一个宏任务。这意味着,您最终可能会遇到 UI 阻塞或应用程序中某些已完成的 I/O 闲置的情况。
然而,至少关于 Node.js 的 process.nextTick 函数(它将微任务),通过 process.maxTickDepth 内置了针对此类阻塞的保护。该值设置为默认值 1000,减少进一步处理微任务达到此限制后允许下一个宏任务待处理)
那么什么时候用什么?
基本上,使用微任务当你需要以同步方式异步做事情时(即当你会说在最近的将来执行此(微)任务)。
否则,坚持宏任务.
Examples
宏观任务: 设置超时时间 https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout, 设置时间间隔 https://developer.mozilla.org/docs/Web/API/WindowTimers/setInterval, 设置立即 https://developer.mozilla.org/docs/Web/API/Window/setImmediate, 请求动画帧 https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame, I/O https://developer.mozilla.org/docs/Mozilla/Projects/NSPR/Reference/I_O_Functions,UI渲染
微任务: process.nextTick https://nodejs.org/uk/docs/guides/event-loop-timers-and-nexttick/, Promises https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise, 队列微任务 https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/queueMicrotask, 变异观察者 https://developer.mozilla.org/docs/Web/API/MutationObserver
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)