簡體   English   中英

異步 function 何時實際返回待處理的 promise?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM