Javascript 为什么异步函数在等待已解析的承诺时返回?

Javascript 为什么异步函数在等待已解析的承诺时返回?,javascript,language-design,Javascript,Language Design,事实上,这种行为可能会导致一些性能问题,即在两个系统之间进行额外的上下文切换 调用异步函数的“线程”和“延续尾部” 异步函数f(){ 等待承诺。下决心(“某事”); 控制台日志(“f:等待后”); 返回“somthing_else”; } 函数g(){ 常数fres=f(); console.log(“g:f返回”); fres.then((x)=>console.log(“finish”); } g()f函数是异步的,所以您应该在g函数中等待它 async function g(){ c

事实上,这种行为可能会导致一些性能问题,即在两个系统之间进行额外的上下文切换 调用异步函数的“线程”和“延续尾部”

异步函数f(){ 等待承诺。下决心(“某事”); 控制台日志(“f:等待后”); 返回“somthing_else”; } 函数g(){ 常数fres=f(); console.log(“g:f返回”); fres.then((x)=>console.log(“finish”); }
g()
f
函数是异步的,所以您应该在
g
函数中等待它

async function g(){
  const fres = await f();
  console.log("g: f returns");
  fres.then((x) => console.log("finish"));
}

承诺放置在队列中,该队列在当前正常脚本队列为空后执行

因此,您将完成g()的运行,并因此按下
console.log(“g:f returns”)添加到当前堆栈


如果日志位于
fres.then()
函数中,则只有在
f()
解析后才会记录日志。

AFAIK这就像使用延迟为0的setTimeout一样。如果您愿意,它仍然会在下一个“周期”中结束,并且直到当前函数完成后才会执行。
异步
/
等待
功能不会改变这一点。因此,依赖于承诺完成的代码在
g()
完成之前无法运行。@Pointy您的注释可能应该是answer@user396672我在找一个复制品,因为我很确定就在几个月前,就我所知,有一个非常类似的问题,OP希望函数的行为像非异步函数一样,如果它立即解析并询问为什么不解析。