Как я могу последовательно соединить обещания и получить результат, когда все закончится с использованием bluebirdjs?

Подобный вопрос уже задавался здесь, но мне интересно, как получить результат, когда все обещания выполнены.

В моем коде я устанавливаю файлы на устройство - это нужно делать последовательно, а установка создает обещание.

Вдохновленный приведенным выше примером и примером из документации BluebirdJS, я получил следующий код:

  Promise.each(files, function(file, index){
    self.adbClient.install(device, file.path)
    .then(function() {
      console.log('%s installed on device %s', file.name, device)
    })
    .catch(function(err) {
      console.error('Something went wrong when installing %s on %s: '+  err.stack, file.name, device)
    })
  }).then(function() { console.log("All done"); })
  .catch(function(err) { console.log("Argh, broken: " + err.message); })

После исполнения я получаю:

All done
first-file.apk installed on device LGV400d1d1a81d
second-file.apk installed on device LGV400d1d1a81d

Как я могу получить сообщение " Все выполнено" после завершения всех установок?

1 ответ

Решение

Согласно правильной документации http://bluebirdjs.com/docs/api/promise.each.html -

Если функция итератора возвращает обещание или toableable, то результат обещания ожидается перед продолжением следующей итерации

Итак, это простой случай добавления return следующее

 Promise.each(files, function(file, index){
    return self.adbClient.install(device, file.path)
 // ^^^^^^
 // rest of your code
Другие вопросы по тегам