这个问题的意图与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
答案 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");
发生了什么事
console.log("A1")
运行(当然)。outer()
被呼叫。outer
的同步部分运行,因此:
console.log("1")
f
f()
f
的同步部分运行,因此:
console.log('2')
f
隐式返回,因此它将其承诺返回给outer
。该承诺已通过值undefined
实现。 (请参阅规范中的here。)outer
等待f
的诺言,因此将其诺言返回给调用方(这将其丢弃,但这没关系)。outer
等待f
的承诺,因为outer
的承诺已经兑现,微任务排队继续执行f
。console.log("A2")
运行。outer
继续执行console.log("3")
。