Javascript 异步函数何时实际返回挂起的承诺?

Javascript 异步函数何时实际返回挂起的承诺?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我在谷歌上搜索了很多次这个问题,但我看到的唯一答案是: 异步函数总是返回一个承诺 但我还没有找到任何答案来回答什么时候会发生这种情况 它是在进入异步函数时,还是在遇到第一个wait关键字时 我刚刚写了这段代码: 异步函数main(){ console.log(true); 让p=等待新的承诺(r=>setTimeout(r,2000100)); 返回p; } 异步函数f(){ 内部(等待main()) 内部功能(d){ 控制台日志(d+10) } console.log('done') } f(

我在谷歌上搜索了很多次这个问题,但我看到的唯一答案是:

异步函数总是返回一个承诺

但我还没有找到任何答案来回答什么时候会发生这种情况

它是在进入异步函数时,还是在遇到第一个
wait
关键字时

我刚刚写了这段代码:

异步函数main(){ console.log(true); 让p=等待新的承诺(r=>setTimeout(r,2000100)); 返回p; } 异步函数f(){ 内部(等待main()) 内部功能(d){ 控制台日志(d+10) } console.log('done') } f(); 最重要的是:

inner(await main())
main()
将首先执行,因为函数调用在优先级表中具有更高的优先级,并且由于异步函数返回承诺,它将返回挂起的承诺

但要返回该值,我们必须首先执行main(),因此它进入主执行上下文并看到
console.log(true)

现在是
main()
返回挂起承诺的地方了吗

或者,它会记录这些信息,然后到达
wait
关键字,然后返回一个待定的承诺

如果这是我们的代码:

异步函数main(){ (需要30秒才能完成的函数(){ //一些耗时的任务 }()) 让p=等待新的承诺(r=>setTimeout(r,2000100)); 返回p; }
现在在这种情况下,这一行的
main()
内部(wait main())是否会立即返回一个挂起的承诺,或者需要30秒才能返回一个挂起的承诺

现在我的猜测是:


此行
internal(await main())
将立即返回一个挂起的承诺,但main()中的代码将继续执行,直到到达第一个wait关键字,对吗?

异步函数同步运行,直到到达第一个
await
(或函数结束)。然后它返回一个新的未解析承诺,该承诺将在稍后函数完成执行时解析。然后,异步函数的执行停止,调用异步函数的代码的同步执行继续

此行inner(await main())将立即返回一个挂起的承诺,但main()中的代码将继续执行,直到到达第一个await关键字,对吗

否。首先将同步执行
main()。当到达
wait
f
本身也会返回一个新的承诺并停止执行


语义详细信息可以在中找到。

@touffy true,将第一句话稍微修改了一点,以减少误读。@touffy在异步函数中没有
wait
s的返回仍然会在稍后解决,而不是立即解决。@vlaz会立即解决,但会在稍后解决。我同意在这个答案中区分这一点可能是错误的:)