Mic*_*mar 3 javascript asynchronous 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();
Run Code Online (Sandbox Code Playgroud)
最重要的一行是:
inner(await main())
Run Code Online (Sandbox Code Playgroud)
main()将首先执行,因为函数调用在优先级表中具有更高的优先级,并且当异步函数返回一个承诺时,它返回一个待处理的承诺!
但要返回它,我们必须首先执行 main(),因此它进入主执行上下文并看到console.log(true);
现在,这就是 ? 返回待处理的承诺的地方吗main()?
或者它会记录下来,然后到达关键字await,然后返回一个待处理的承诺?
如果这是我们的代码怎么办:
inner(await main())
Run Code Online (Sandbox Code Playgroud)
现在在这种情况下,这一main()行会inner(await main())立即返回一个待处理的承诺,还是需要 30 秒才能返回一个待处理的承诺?
现在我的猜测是:
该行将inner(await main())立即返回一个待处理的承诺,但 main() 内的代码将继续执行,直到到达第一个等待关键字,这是正确的吗?
异步函数同步运行,直到到达第一个函数await(或函数的末尾)。然后它返回一个新的未解决的 Promise,该 Promise 将在稍后函数完成执行时解决。然后,异步函数的执行将停止,而调用异步函数的代码的同步执行将继续。
这行inner(await main())将立即返回一个待处理的承诺,但main()内部的代码将继续执行,直到到达第一个await关键字,这是正确的吗?
不会。 Firstmain()将同步执行,直到 async main 函数内的代码到达 an await,然后它将返回一个 Promise 并f继续执行。正如当时的await到达的内容f本身也会返回一个新的 Promise 并停止执行。
语义细节可以在规范中找到。
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |