![](/img/trans.png)
[英]How do I wait for a promise to finish inside a loop? (without using async-await)
[英]Why I still have to wait for while loop when using async-await syntax?
我試圖深入理解async-await
語法。 所以我寫了一些代碼來說明我對async-await
了解。 這是我的代碼:
doSomething(); doFirst(); async function doSomething() { const result = await stackUp(); console.log(result); } function doFirst() { console.log('first'); } function stackUp() { let counter = 0; while (counter < 4000000000) { counter++; } return counter; }
我調用doSomething()
然后doFirst()
。 while loop
用於延遲進程。 控制台first
按預期注銷然后4000000000
。 到目前為止我個人理解, first
應該安慰了立即然后等待stackUp()
來完成計數, 4000000000
將是下一個。 但問題first
不是立即安慰。 我仍然需要等待stackUp()
完成然后兩者都將被注銷。 如果我使用setTimeout()
來延遲,一切正常。 這是因為while loop
在JavaScript運行時運行並阻止了代碼嗎?
Async await實際上並不允許您多線程化JS代碼。 默認情況下,它仍然全部同步運行,但等待的任何內容都將附加到它等待的promise的回調中。 如果你想運行JS真正的多線程,你必須將你的代碼放在主線程之外的webworker中,並等待基於與webworker通信的承諾。
TLDR; 你不能直接多線程JS
Async / Await的行為類似於同步代碼執行,這就是為什么它的控制台同時都是輸出。
異步方法執行進入回調隊列。回調隊列在執行回調函數時使用事件循環。
非回調函數(doFirst)將轉到主調用堆棧。
在主調用堆棧的代碼執行之后,它將在Event循環的幫助下執行回調隊列,如果Callback隊列具有要執行的代碼,則它將消息從它彈出到主堆棧以執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.