解决 javascript 个对象中的 Promises

Resolving Promises within javascript objects

我有一个 JavaScript 对象,里面有未解决的承诺。什么是最优雅和最简单的方法来解决对象中的所有这些承诺并仅在所有这些承诺都得到解决后才继续下一个 'then' 块?

var Promise = require('bluebird')
var _ = require('lodash')

Promise.all(fetchSomeData)
.then(data => {
    /* 'data' contents:
    [
        { 
          foo: 'foo1', 
          bar: 'bar1', 
          datatofetch: new Promise((resolve,reject) => {...}) 
        },
        { 
          foo: 'foo2', 
          bar: 'bar2', 
          datatofetch: new Promise((resolve,reject) => {...}) 
        },
        { 
          foo: 'foo3', 
          bar: 'bar3', 
          datatofetch: new Promise((resolve,reject) => {...}) 
        }
        ...
   ]
   */

   return // TODO: 'data' object with resolved promises
})
.then(dataWithResolvedPromises => {
    // do something with dataWithResolvedPromises
})

您可以使用两个不同的 Promise.all 调用,并在解决后将第二个的结果简单地映射回第一个的结果

var Promise = require('bluebird')
var _ = require('lodash')

var myObjects
Promise.all(fetchSomeData)
.then(data => {
    myObjects = data;
    return Promise.all(data.map(d => d.datatoFetch)
})
.then(fetched => fetched.map((result, i) => _.extend({}, myObjects[i], { dataToFetch: result })))
.then(dataWithResolvedPromises => {
    // do something with dataWithResolvedPromises
})

结合使用 Promise.propsPromise.all 似乎是解决此问题的最简单方法。

Promise.all(fetchSomeData)
.then(data => {
    return Promise.map(data, Promise.props)
})
.then(dataWithResolvedPromises => {
    // do something with dataWithResolvedPromises
})
.catch(err => {
    console.log(err)
})