是否可以在每个 promise 完成后 运行 回调,然后在所有 promise 完成后再回调?

Is it possible to run callback after each promise completes and then another when all complete?

我愿意

  1. 创建一系列承诺(通过 jQuery get/post 调用 API)
  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

我觉得你的问题很清楚,不用一堆代码。重要的是要理解 .then() return 是一个承诺。这意味着您可以在单个承诺通过调用 then() 解决并保存 then() 中的 return 值时进行工作,这也是数组中的承诺。您将该数组传递给 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))