我的节点应用程序将发票数据发送到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)});
答案 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