首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >宏任务队列和微任务队列优先级

宏任务队列和微任务队列优先级
EN

Stack Overflow用户
提问于 2019-03-16 18:44:31
回答 2查看 1K关注 0票数 0

macrotaskmicrotask队列的这种描述相混淆。

对于“事件循环”的每个循环,将从宏任务队列中完成一个宏任务。该宏任务完成后,事件循环将访问microtask队列。在继续之前,将完成整个微任务队列。

代码语言:javascript
运行
复制
setTimeout(function() {
  console.log('macrotask');
}, 0);

Promise.resolve().then(function() {
  console.log('microtask 1');
}).then(function() {
  console.log('microtask 2');
});

这段代码不应该首先输出“宏任务”吗?因为setTimeout是在循环进入微任务队列之前完成的宏任务队列的一部分?

EN

回答 2

Stack Overflow用户

发布于 2019-03-16 18:48:18

您的代码运行的任务实际上是一个macrotask

当完成时(这意味着评估和运行您的代码),事件循环将执行队列中的微任务。这是第一个承诺,但是这个承诺为微任务q添加了另一个承诺,第二个承诺被执行。

清除微任务q后,选择另一个宏任务,并最终执行timeout

票数 2
EN

Stack Overflow用户

发布于 2019-09-24 12:18:26

在执行任何JS文件时,JS引擎将内容封装在函数中,并将该函数与事件启动或启动关联起来。JS引擎发出开始事件,事件被添加到任务队列(作为宏任务)。

初始化时,JS引擎首先提取宏任务队列中的第一个任务,并执行回调处理程序。因此,我们的代码被运行。

因此,我们看到运行的脚本是第一个排队的macrotask。因此,首先,JSEngine将脚本中的所有同步代码添加为事件循环队列中的macrotask。然后它会看到setTimeout,这是另一个macrotask,因此它被记录在事件循环队列中的一个单独的任务中。然后,它看到了承诺,它是一个microtask,并将其添加到微任务队列中。

微任务队列在回调之后被处理,只要没有其他JavaScript在执行过程中和每个任务的末尾。

在本例中,任务队列的顺序是Script=>Promise1=>Promise2=>setTimeout

由于脚本中没有同步代码,所以脚本的执行不会打印任何内容。然后引擎执行微任务队列(承诺-1,承诺-2),最后执行宏任务,即setTimeout

注意:-这是默认行为,在不同的浏览器中可能有所不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55200324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档