节点:Promise链中的For循环延迟

时间:2017-12-30 16:01:42

标签: javascript node.js promise delayed-execution

我的节点应用程序将发票数据发送到API,我希望我的应用程序在每个发票过后发送数据/等待一段时间,因为如果每秒超过20,API服务器会阻止请求。

我认为一种方法是在每次迭代后进行for循环暂停,但我不确定如何实现它。

下面是我目前将“发票生成” - 推送到for循环中的数组,然后使用Promise.all解决它们的代码。

所有评论都表示赞赏。

    // First, get access token from the service API
    serviceAPI.auth().then((token) => {

    // Array for the invoice promises
    let invoicePromises = [];

    // Push promises to the array
    for (let i = 0; i < rowAmount; i++) {
        invoicePromises.push(serviceAPI.generate(i, sheetData[i], token));
    }

    return Promise.all(invoicePromises);

    }).then((results) => {
    console.log(results);
    return utils.sortReport(results); // Return sorted results
    }).catch((e) => { console.error(e)});

2 个答案:

答案 0 :(得分:2)

而不是一次创建它们:

 for (let i = 0; i < rowAmount; i++) {
    invoicePromises.push(serviceAPI.generate(i, sheetData[i], token));
}
return Promise.all(invoicePromises);

可以建立一个接一个调用的Promise链:

 sheetData.reduce((promise, data, i) => promise.then(result => serviceAPI.generate(i, data, token).then(res => result.concat(res))), Promise.resolve([]));

然而那是Promise地狱,所以让我们使用异步等待:

return (async function(){
  const result;
  for (let i = 0; i < rowAmount; i++) {
    result.push(await serviceAPI.generate(i, sheetData[i], token));
   //optionally sth like await timer(1000);
  } 
 return result;
})();

答案 1 :(得分:-2)

要使nodejs应用等待一点然后再继续,您可以使用sleep模块轻松完成此操作。

首先:npm install sleep --save

然后将其添加到代码中的require部分: const sleep = require('sleep');

然后在你的for循环中: sleep.sleep(5); // sleep for 5 seconds sleep.msleep(5); // sleep for 5 milliseconds