Можно ли запустить обратный вызов после завершения каждого обещания, а затем еще одно, когда все выполнено? - PullRequest
0 голосов
/ 10 января 2019

Я бы хотел

  1. создать серию обещаний (вызов API через jQuery get / post)
  2. запускать код после каждый завершается (например, индикатор прогресса)
  3. запустить (другой) код после того, как они все завершены

Как это сделать?

Как-то так - но смотри вопрос в комментарии к 5-й строке

var urls = []; // a bunch of URLs

Promise.all(
        urls.map(e => {
            return $.post(e);
            // do something here after post has succeded
            /// but still return a promise
        })
        ).then(d => {
           // do something when all succeed 
        }).catch(e => {
             console.log(e)
        })

Я в порядке с использованием Bluebird

1 Ответ

0 голосов
/ 10 января 2019

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

/* some async function */
let asyncFn = () => new Promise(resolve => setTimeout(() => resolve(Math.random()), Math.floor(Math.random() * 1500)))

let promises = []
for (let i = 0; i < 10; i++) {
  let p = asyncFn()                             // then() returns a promise, save it in the array:
    .then((r) => {                              // do work for each promise
      console.log('done:', i, "returned: ", r)
      return r                                  // Promise.all() will received these values as an array
    })
  promises.push(p)                              // promises is array of promises
}
// Promise.all() runs when all promises in array have resolved
Promise.all(promises)
.then((arr) => console.log("Everything finished. Final values: ", arr))
...