为什么异步函数在等待已解决的Promise时返回?

时间:2019-02-28 13:17:32

标签: javascript language-design

的确,这种行为可能会导致性能问题,例如,在 异步函数的调用方“线程”和“继续尾部”。

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

是标准规定的行为还是取决于实现?

如果是标准行为,这是什么原因?

2 个答案:

答案 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"));
}