When does async function actually return a pending promise?(异步函数何时实际返回挂起的承诺?)
问题描述
我用谷歌搜索了这个问题很多次,但我看到的唯一答案是:
异步函数始终返回承诺
但我在任何地方都找不到任何答案,这实际上是在什么时候发生的。
是在进入异步函数后立即执行,还是在遇到第一个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()
将首先执行,因为函数调用在优先级表中具有较高的优先级,并且异步函数返回承诺时,它将返回挂起的承诺!
但是要返回它,我们必须首先执行main(),因此它进入主执行上下文并看到console.log(true);
现在是main()
返回待定承诺的位置吗?
或者它将记录此情况,然后它将到达await
关键字,此时它将返回挂起的承诺?
如果这是我们的代码怎么办:
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()
是立即返回待定承诺,还是需要30秒才能返回待定承诺?
现在我猜是:
此行inner(await main())
将立即返回挂起的承诺,但main()内的代码将继续执行,直到到达第一个等待关键字,是否正确?
推荐答案
异步函数同步运行,直到到达第一个await
(或函数末尾)。然后,它返回一个新的未解析承诺,该承诺将在稍后函数完成执行时得到解析。然后,异步函数的执行将暂停,调用异步函数的代码的同步执行将继续。
此行内部(await main())将立即返回挂起的承诺,但main()内的代码将继续执行,直到到达第一个等待关键字,是否正确?
没有。首先同步执行main()
,直到异步主函数内部的代码达到await
,然后返回承诺,继续执行f
。然后,await
到达f
本身也返回新承诺并停止执行。
语义详情请参见specification。
这篇关于异步函数何时实际返回挂起的承诺?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:异步函数何时实际返回挂起的承诺?
基础教程推荐
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 动态更新多个选择框 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 响应更改 div 大小保持纵横比 2022-01-01