繁体   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