node.js 在间隔中迭代数组特定时间

Posted

技术标签:

【中文标题】node.js 在间隔中迭代数组特定时间【英文标题】:node.js Iterate through an array in intervall for certain times 【发布时间】: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 循环。但是在执行脚本时,我收到消息说这是不可能的。根据有关 *** 的文章,这是因为这在异步循环中是不可能的。 【参考方案1】:

假设 request 您指的是 nodejs 模块。这里有一个可能的解决方案,使用像 sleep 这样奇怪的东西 :)

const request = require('request');
const _request = require('util').promisify(request);
let sendItems = [1,2,3];

let sleep = (ms) => 
        return new Promise(function (resolve, reject) 
            setTimeout(function () 
                console.log(`waiting $ms/1000 sec..`)
                resolve();
            , ms);
        )
   
(async function loop() 
    for (let i = 0; i < 10; i++) 

        for (let id of sendItems) 
            let r = await  _request('https://jsonplaceholder.typicode.com/posts/'+id,  json: true )
            console.log(r.body.id);
        
        await sleep(5000);
     console.log("ok that's it")
)();

【讨论】:

非常感谢。我会试试你的方法。是的,你的请求是对的 =) 使用 IIFE 发送请求...很好。 @Callat 你是什么意思:)?你在讽刺吗? 不,我赞成你的实现,(async function loop () ...)(); 是一个立即调用的函数表达式,对吗?我只是发现这个示例以这种方式启动呼叫而不是仅在底部使用 loop() 非常漂亮。 :) 啊,好吧,我以为你在讽刺,因为这不是我的代码中不寻常的事情,或者也许有人会说这不是自动调用远程请求的最佳选择。我认为这里的“有趣”部分是 javascript sleep :)

以上是关于node.js 在间隔中迭代数组特定时间的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 异步数组迭代

在 node.js 中一次遍历一个包含 50 个项目的数组

Node JS 从数组中删除特定对象(猫鼬)

获取属于 JavaScript/Node js 中特定 ID 的数组对象的计数

在 Node.js 中对数组中的相似字符串进行分组

如何在一定的时间间隔后运行 Node.js api?