Javascript 为什么异步函数在等待已解析的承诺时返回?
事实上,这种行为可能会导致一些性能问题,即在两个系统之间进行额外的上下文切换 调用异步函数的“线程”和“延续尾部” 异步函数f(){ 等待承诺。下决心(“某事”); 控制台日志(“f:等待后”); 返回“somthing_else”; } 函数g(){ 常数fres=f(); console.log(“g:f返回”); fres.then((x)=>console.log(“finish”); }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
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”)在解析f()之前,将代码>添加到当前堆栈
如果日志位于fres.then()
函数中,则只有在f()
解析后才会记录日志。AFAIK这就像使用延迟为0的setTimeout一样。如果您愿意,它仍然会在下一个“周期”中结束,并且直到当前函数完成后才会执行。异步
/等待
功能不会改变这一点。因此,依赖于承诺完成的代码在g()
完成之前无法运行。@Pointy您的注释可能应该是answer@user396672我在找一个复制品,因为我很确定就在几个月前,就我所知,有一个非常类似的问题,OP希望函数的行为像非异步函数一样,如果它立即解析并询问为什么不解析。