【发布时间】:2018-11-29 14:46:48
【问题描述】:
我在 node.js 上工作了很短的时间,目前遇到以下问题:我想遍历一个数组并为数组中的每个元素发送一个 http 请求。这些请求应每 5 秒执行一次。除此之外,这应该做到最大。 10 次。
这意味着每 5 秒应该为数组中的所有元素发送一个 http 请求。
我已经为每个循环尝试了一个分支异步,但我没有得到想要的结果。
我知道我的代码问题出在哪里,但找不到其他解决方案。
看起来像这样:
// Set for loop
for (var i = 0; i <= 10; i++) {
setTimeout(function () {
// Iterate through every element within the array
sendItems.forEach(function (arrayItem) {
// Some code
request (.....)
// Exit condition
if (sendItems[sendItems.length - 1].status === 'Failed'|||
sendItems[sendItems.length - 1].status ==='Successful') {
if (cbFlag === false) {
interval = 0;
resolve(sendItems);
}
}
});
}interval * i);
【问题讨论】:
-
request(.....),这是同步还是异步?没有setTimeout,循环是否正常工作? -
您好,这是一个异步循环。到目前为止它有效。这意味着它每 5 秒迭代一次数组的元素。什么不起作用是中止条件。虽然我调用了 resolve(),但 for 循环的其余迭代都会执行,包括 forEach 循环。
-
所以如果我理解正确的话。
cbFlag在其他地方确定,但一旦它是错误的,你调用resolve(sendItems)应该返回一个列表给承诺。但是,循环已经在线程上,并且由于它在超时中得到解决,因此没有break告诉循环停止执行调用。您是否尝试过设置标志,调用break,然后解决承诺? -
cbFlag 最初用于在forEach 循环调用resolve() 时立即用breaks() 终止for 循环。但是在执行脚本时,我收到消息说这是不可能的。根据有关 stackoverflow 的文章,这是因为这在异步循环中是不可能的。
标签: arrays node.js loops httprequest settimeout