我的代码如下所示:
someArray.forEach(x => {
// do something
console.log(‘calling api for ‘ + x);
callAnHttpApiAsync(...);
sleep(10);
});
http api 调用是异步的(但我不使用任何等待/异步语法),并在 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 和 wait/async 解决了这个问题(如果您有更好的想法,请告诉我),但我无法理解这种奇怪行为的原因。为什么我只有在完整循环后才能得到响应?有任何想法吗?抱歉格式不对,但我在移动设备上。
完全披露:我真的不了解node.js,只了解客户端javascript,但我认为解释在这里也适用。
问题的关键在于“异步”并不意味着“并行”。当您调用异步操作时,它会被放入队列中。当 JSVM 完成执行当前正在运行的代码时(在本例中是包含您的代码)forEach
),然后且只有此时它才会获取异步队列中的第一个操作并执行它;然后,当它完成时,它会运行下一个,依此类推。 IE。无论您启动多少个异步作业,一次只会运行一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)