首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算过程中宏任务和微任务队列的状态

计算过程中宏任务和微任务队列的状态
EN

Stack Overflow用户
提问于 2019-06-05 08:33:39
回答 1查看 125关注 0票数 3

这个问题在意图上与事件循环上下文中的微任务和宏任务的区别非常相似,但更具体的是,它要求解释一个明确的例子:我认为出于这个原因,它不应该被视为重复。

在node.js中执行此代码时,状态宏任务队列和微任务队列是什么?

代码语言:javascript
复制
console.log("A1");

(async ()=> {

    console.log("1")

    f = async ()=>{console.log('2')}

    await f()

    console.log("3")

})()

console.log("A2");

输出:

代码语言:javascript
复制
A1
1
2
A2
3

预期输出: A1,A2,'1','2','3‘

基于这个推理:日志A1 ->微任务队列上的匿名函数-->日志A2 ->执行匿名函数日志1,微任务队列上的队列f->从微任务队列执行f-> log 2-> log 3

我哪里出问题了?(此外,顶级异步函数是如何排队的?)

注意:用于运行此操作的实际命令是npx node myscript.js。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 08:39:01

您可以看到这种行为,因为async函数同步地运行,直到第一个await、显式return或隐式return (代码执行从函数的末尾落下)。

我将稍微修改代码,以便给外部async函数取一个名称,这样更容易讨论:

代码语言:javascript
复制
console.log("A1");
const outer = async () => {
    console.log("1")
    f = async ()=>{console.log('2')}
    await f()
    console.log("3")
};
outer();
console.log("A2");

下面是发生的事情:

  1. console.log("A1")运行(当然)。
  2. outer()被称为。
  3. outer的同步部分运行,因此它:
    • 运行console.log("1")
    • 创建f
    • 调用f()

  1. f的同步部分运行,因此它:
    • console.log('2')

  1. 此时,f隐式返回,因此它将其承诺返回给outer。这个承诺已经用undefined值实现了。(见规范中的这里。)
  2. outer等待f的承诺,所以它会将它的承诺返回给调用者(它会丢弃它,但这并不重要)。
  3. outer等待着f的承诺,因为f的承诺已经确定,于是就排起了继续outer的微任务队伍。
  4. console.log("A2")运行。
  5. 微任务运行,允许outer继续并执行console.log("3")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56456877

复制
相关文章

相似问题

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