Узел: задержка цикла внутри цепи Promise
Мое приложение Node отправляет данные счета-фактуры в API, и я хотел бы, чтобы мое приложение отправляло данные последовательно / через некоторое время после каждой публикации счета-фактуры, поскольку сервер API блокирует запросы, если их число превышает 20 в секунду.
Я думаю, что одним из способов было бы сделать паузу цикла 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 ответа
Вместо того, чтобы создавать их по одному:
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, поэтому давайте вместо этого используем async await:
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;
})();
Чтобы заставить приложение nodejs немного подождать, а затем продолжить, вы можете легко это сделать с помощью спящего модуля.
первый: npm install sleep --save
затем добавьте это в раздел require в вашем коде:
const sleep = require('sleep');
а затем в вашем для цикла:
sleep.sleep(5); // sleep for 5 seconds
sleep.msleep(5); // sleep for 5 milliseconds