【问题标题】:Is it possible to run callback after each promise completes and then another when all complete?是否可以在每个承诺完成后运行回调,然后在全部完成后运行另一个?
【发布时间】:2019-01-11 03:46:55
【问题描述】:

我愿意

  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

【问题讨论】:

  • 作为拥有 1k+ 代表的人,您应该知道“如何创建最小、完整和可验证的示例。”。花点时间,提供一个你想要完成的例子。
  • 只需将 .then 添加到循环中的 Promise 中,收集一系列 Promise。然后将该数组提供给 Promise.all() 和一个 .then 就可以了。
  • @kemikofa 有时(正如马克所提到的)代码实际上会使问题变得更难,更不容易理解,并且不太适用。恕我直言,至少。因此避免了我现在添加的代码 FWIW。
  • @mark-meyer - 谢谢。 .then() 返回一个承诺是我错过的一点

标签: javascript promise bluebird


【解决方案1】:

我认为你的问题很清楚,没有一堆代码。要理解的重要一点是.then() 返回一个承诺。这意味着您可以通过调用then() 解决单个promise 并保存来自then() 的返回值,这也是数组中的promise。您将该数组传递给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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2014-09-28
    • 1970-01-01
    • 2018-05-26
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多