簡體   English   中英

為什么在使用async-await語法時我仍然需要等待while循環?

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

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