【发布时间】:2019-02-28 13:17:32
【问题描述】:
确实,这样的行为可能会导致一些性能问题,即额外的上下文切换 异步函数的调用者“线程”和“延续尾部”。
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
由于 await 运算符实际上没有什么可等待的,我希望:
f: after await
g: f returns
finish
该行为是由标准指定还是取决于实现?
如果是标准行为,原因是什么?
【问题讨论】:
-
AFAIK 就像使用延迟为 0 的 setTimeout。如果您愿意,它仍然会在下一个“周期”结束,并且在当前函数完成之前不会执行。
-
Promise 回调按照规范在特殊上下文中调用。
async/await设施不会改变这一点。因此,依赖于 Promise 完成的代码在g()完全完成之前无法运行。 -
@Pointy 也许你的评论应该是一个答案
-
@user396672 我正在寻找一个副本,因为我很确定几个月前有一个非常相似的问题
标签: javascript language-design