[英]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.