Узел: задержка цикла внутри цепи 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

Другие вопросы по тегам