[英]When does async function actually return a pending promise?
我用谷歌搜索了很多次这个问题,但我看到的唯一答案是:
异步 function 总是返回 promise
但是我在任何地方都没有找到任何可以回答的问题。
是一进入异步 function 还是一遇到第一个await
关键字?
我刚刚写了这段代码:
async function main() {
console.log(true);
let p = await new Promise(r => setTimeout(r, 2000, 100));
return p;
}
async function f() {
inner(await main())
function inner(d) {
console.log(d + 10)
}
console.log('done')
}
f();
最重要的一行是:
inner(await main())
main()
将首先执行,因为 function 调用在优先级表中具有更高的优先级,并且异步 function 返回一个 promise,它返回一个未决的承诺!
但要返回它,我们必须先执行 main(),所以它进入主执行上下文并看到console.log(true);
现在是main()
返回未决 promise 的地方吗?
或者它会记录它,然后它会到达await
关键字,那时它会返回一个待处理的 promise?
如果这是我们的代码怎么办:
async function main() {
(function thatTakes30SecondsToFinish() {
// some time consuming task
}())
let p = await new Promise(r => setTimeout(r, 2000, 100));
return p;
}
现在在这种情况下,此行inner(await main())
main()
的 main() 是否会立即返回一个挂起的 promise 或者在返回一个挂起的 promise 之前需要 30 秒?
现在我的猜测是:
这一行inner(await main())
将立即返回一个挂起的 promise 但 main() 中的代码将继续执行,直到它到达第一个 await 关键字,对吗?
异步 function 同步运行,直到它到达第一个await
(或函数结束)。 然后它返回一个新的未解析的 Promise,稍后当 function 完成执行时,它将被解析。 然后异步 function 的执行停止,调用异步 function 的代码的同步执行继续。
这一行 inner(await main()) 将立即返回一个挂起的 promise 但 main() 中的代码将继续执行,直到它到达第一个 await 关键字,对吗?
不会。首先main()
将同步执行,直到异步主 function 中的代码到达await
,然后它将返回 promise 并继续执行f
。 然后await
到达f
本身也返回一个新的 Promise 并停止执行。
语义细节可以在规范中找到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.