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会立即解决,但会在稍后解决。我同意在这个答案中区分这一点可能是错误的:)