簡體   English   中英

JavaScript:forEach循環中的奇怪行為

[英]JavaScript: Weird behavior in forEach loop

我的代碼如下所示:

someArray.forEach(x => {
// do something
console.log(‘calling api for ‘ + x);
callAnHttpApiAsync(...);
sleep(10);
});

http api調用是異步的(但是我不使用任何await / async語法),並且一旦api發送回響應,就會記錄一些內容。 發生的情況是forEach循環已完成,僅在此之后我才開始看到記錄的響應。 我希望在循環結束之前會看到一些響應(我嘗試增加睡眠量),但是無論等待多長時間或循環持續多長時間,響應總是在循環結束后記錄下來。 我使用節點的睡眠庫。 我看到這樣的東西:

calling api for 1
calling api for 2
calling api for 3
...
calling api for 10000
got response for 1
got response for 2
got response for 3
...
got response for 10000   

我已經通過使用for-of和await / async解決了這個問題(請告訴我您是否有更好的主意),但是我無法理解這種奇怪行為的原因。 為什么僅在完整循環后才能獲得響應? 有任何想法嗎? 很抱歉格式化,但是我在移動設備上。

完全公開:我不太了解node.js,只有客戶端javascript,但我認為這里的解釋同樣適用。

問題的症結在於“異步”並不意味着“並行”。 當您調用異步操作時,它將被放入隊列中。 當JSVM完成執行它當前正在運行的代碼(在本例中為包含您的forEach的代碼)后,然后只有這樣做,它才會在異步隊列中執行第一個操作並執行它; 然后,當完成時,它會在那之后運行一個,依此類推。 即,無論您啟動多少異步作業,一次都只會運行一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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