Nodejs, как задержать выполнение между асинхронными итерациями, которые возвращает Promise - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть следующая функция, которая должна возвращать Promise после того, как ВСЕ уведомления были успешно / неудачно отправлены:

sendNotifications : function(notificationArray, successCallback, stats){

        return notificationArray.reduce((acc, x)=>{
                return Promise.all([
                    notificationUtil.sendNotification(x)
                        .then(
                            function() {
                                successCallback(x);
                            }
                        )
                        .catch(e=>{
                            //handle failure...
                        }),
                    new Promise(resolve => setTimeout(resolve, 1000))//Was thinking it will delay the sendNotification calls but it hasn't.
                ])
            }, Promise.resolve());
    },

Вот метод notificationUtil.sendNotification(x):

sendEmail: sendNotification (options) {
    return new Promise(function(resolve,reject){
            someNPM.sendNotification(function(data) {
                if(!data.error_code && !data.is_error)
                    resolve(true);
                else
                {
                    reject(false);
                    console.error("ERROR: " + data.message);
                }
            },
            options);
        });
}

Функция someNPM.sendNotification от внешнего NPM, и она не возвращает Обещание, следовательно, я обещала это.

Проблема в том, что я ожидала задержку 1000ms между notificationUtil.sendNotification(x) вызовами, но дело не в этом, и sendNotification(x) вызывается сразу для всех элементов из notificationArray

Может кто-нибудь определить проблему?

РЕДАКТИРОВАТЬ: Чтобы было ясно, мое требование состоит в том, чтобы ждать 1000 мсмежду уведомлениями

1 Ответ

0 голосов
/ 05 ноября 2019

Возможная реализация. Я не проверял этот код, но он должен дать представление.

function timeout(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

sendNotifications : async function (notificationArray, successCallback, stats){
  const length = notificationArray.length;
  const promises = [];
  for(let i = 0; i < length; i++) {
    promises.push(notificationUtil.sendNotification(notificationArray[i]));
    await timeout(3000);
  }
  await Promise.all(promises);
};
...