的确,这种行为可能会导致性能问题,例如,在 异步函数的调用方“线程”和“继续尾部”。
async function f(){
await Promise.resolve("something");
console.log("f: after await");
return "somthing_else";
}
function g(){
const fres = f();
console.log("g: f returns");
fres.then((x) => console.log("finish"));
}
g();
输出为(至少在我的Chrome中):
g: f returns
f: after await
finish
由于等待操作员实际上没有什么可等待的,所以我希望:
f: after await
g: f returns
finish
是标准规定的行为还是取决于实现?
如果是标准行为,这是什么原因?
答案 0 :(得分:1)
在当前普通脚本队列为空之后,将执行的队列放置在队列中。
因此,您将完成g()的运行,因此,在f()解析之前,将console.log("g: f returns");
推入当前堆栈。
如果日志位于fres.then()
函数内部,则仅在f()
解析后才记录日志。
答案 1 :(得分:0)
f
函数是异步的,因此您应该在g
函数中等待它
async function g(){
const fres = await f();
console.log("g: f returns");
fres.then((x) => console.log("finish"));
}