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

标签 javascript node.js promise event-loop

我刚读完 Promises/A+ 规范,偶然发现了微任务和宏任务这两个术语:见 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 规范,我理论上应该能够自己提取差异。但我相信其他人也可以从专家的简短解释中受益。

最佳答案

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

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

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

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

那么什么时候用什么?

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

示例

宏任务: setTimeout , setInterval , setImmediate , requestAnimationFrame , I/O , UI渲染
微任务: process.nextTick , Promises , queueMicrotask , MutationObserver

关于javascript - 事件循环上下文中微任务和宏任务之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25915634/

相关文章:

javascript - 使用异步 Action Vuex 加载状态

javascript - 如何将跟踪事件推送到serviceWorker中?

javascript - 测试嵌套 JavaScript 对象键是否存在

javascript - 使用 slider 更新 THREE.Mesh.position onchange 事件

Node.js 和 Require.js 包含整个目录

node.js - Bot 框架 Directline - 使用 node.js 更改 Bot 名称运行时

Node.js Mongoosejs 填充填充字段

javascript - 在 promise 存在之前等待它

javascript - Try Catch 无法捕获 UnhandledPromiseRejectionWarning

node.js - Mongoose promise 和 sonarqube