计算过程中Macrotask和Microtask队列的状态

时间:2019-06-05 08:33:39

标签: javascript node.js async-await

这个问题的意图与Difference between microtask and macrotask within an event loop context非常相似,但是更具体地讲,它要求给出一个确定的示例的解释:出于这个原因,我认为不应将其视为重复的示例。

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

console.log("A1");

(async ()=> {

    console.log("1")

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

    await f()

    console.log("3")

})()

console.log("A2");

输出:

A1
1
2
A2
3

我期望的输出: A1,A2,'1','2','3'

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

我要去哪里错了? (此外,如何将顶级异步函数排入队列?)

注意:用于运行该命令的实际命令是npx babel-node myscript.js

1 个答案:

答案 0 :(得分:1)

您正在看到此行为,因为async函数同步运行,直到第一个await,显式return或隐式return为止(代码执行从函数末尾开始)。

我将略微更改代码,以为外部async函数起一个名字,以便于讨论:

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()
  4. f的同步部分运行,因此:
    • console.log('2')
  5. 这时,f隐式返回,因此它将其承诺返回给outer。该承诺已通过值undefined实现。 (请参阅规范中的here。)
  6. outer等待f的诺言,因此将其诺言返回给调用方(这将其丢弃,但这没关系)。
  7. outer等待f的承诺,因为outer的承诺已经兑现,微任务排队继续执行f
  8. console.log("A2")运行。
  9. 微任务运行,允许outer继续执行console.log("3")