JavaScript:forEach循环中的奇怪行为

时间:2018-04-21 09:48:31

标签: javascript node.js foreach

我的代码如下所示:

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-和await / async解决了这个问题(如果你有更好的想法,请告诉我),但我无法理解这种奇怪行为的原因。为什么我只在完整循环后得到响应?有任何想法吗?很抱歉格式化,但我在移动设备上。

1 个答案:

答案 0 :(得分:2)

完全披露:我真的不知道node.js,只知道客户端的javascript,但我认为解释也适用于此。

问题的症结在于“异步”并不意味着“平行”。当您调用异步操作时,它将被放入队列中。当JSVM完成执行当前正在运行的代码(在这种情况下是包含data-post_id的代码)时,然后才会执行异步队列中的第一个操作并执行它;然后,当它完成时,它会在那之后运行,依此类推。即无论你开始多少次异步工作,一次只能运行一次。