这个问题在意图上与事件循环上下文中的微任务和宏任务的区别非常相似,但更具体的是,它要求解释一个明确的例子:我认为出于这个原因,它不应该被视为重复。
在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-> log 2-> log 3
我哪里出问题了?(此外,顶级异步函数是如何排队的?)
注意:用于运行此操作的实际命令是npx node myscript.js。
发布于 2019-06-05 08:39:01
您可以看到这种行为,因为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")ff()
f的同步部分运行,因此它:console.log('2')
f隐式返回,因此它将其承诺返回给outer。这个承诺已经用undefined值实现了。(见规范中的这里。)outer等待f的承诺,所以它会将它的承诺返回给调用者(它会丢弃它,但这并不重要)。outer等待着f的承诺,因为f的承诺已经确定,于是就排起了继续outer的微任务队伍。console.log("A2")运行。outer继续并执行console.log("3")。https://stackoverflow.com/questions/56456877
复制相似问题