Promise.all () каждый ответ на обещание

1

Мне нужно вызвать операции ascync в цикле:

for (var i = 0; i < message.destinatarios.length; i++) {
  messageList.push(this.sms.send(destinatario.numero_celular, string));
 // this will take a litle time to be executed
}

// Here I need something to be fired each time one of the promises in messageList is resolved

Promise.all(messageList)
  .then(res => {
     //that is executed when all the promises have been resolved 
  })
  .catch(err => {
     // that is executed when some of then fail
  });

Тогда для каждого ответа мне нужно увеличить счетчик, как это

console.log("processing " + counter++ + " of " + messageList.length);

Как я буду делать это правильно, так как мне нужно ждать, пока все обещания будут завершены до перехода на следующий шаг?

  • 0
    Зачем увеличивать счетчик, если у вас есть индекс? Promise.all предоставит вам все результаты в том порядке, в котором вы их отправили.
  • 0
    this.sms.send() возвращает обещание?
Показать ещё 12 комментариев
Теги:
promise
ionic3

2 ответа

1
Лучший ответ

Вы можете назначить resolveCallback для каждого обещания. Затем используйте Promise.all() чтобы дождаться всех ваших обещаний, чтобы выполнить любую работу, которая должна ждать завершения всех этих действий.

let counter = 0;
for (var i = 0; i < message.destinatarios.length; i++) {
  const prom = this.sms.send(destinatario.numero_celular, string);
  messageList.push(prom);
  prom.then(() => {
    //your logic for whatever you want to do for every time a promise is resolved
    console.log("processing " + ++counter + " of " + messageList.length); 
  })
}
Promise.all(messageList)
  • 0
    Кажется, это наиболее привлекательный способ ее решения, но повлияет ли ответ в каждом обещании на ответ Promise.all?
  • 0
    @WelderMarcos, №
Показать ещё 1 комментарий
-2

Promise.all параллельно выполняет вложенные обещания. Вы не можете использовать счетчик AFAIK. По крайней мере, без изменения счетчика в качестве побочного эффекта.

  • 0
    Большое спасибо за объяснение @Alex

Ещё вопросы

Сообщество Overcoder
Наверх
Меню