2015-11-20 91 views
0

我正在使用BluebirdJS承诺库。将多个Bluebird承诺组合到单个承诺对象中

我有一个名为getOrder的方法,它基于承诺的形式返回基于PO编号的订单详细信息。

var poNumber = '12345'; 
return getOrder(poNumber).then(function (order) { 
    console.log(order.poNumber, order.items[0].sku); 
    return order; 
}); 

但是我现在需要调用的循环这个方法,并结合有关订单的详细信息到一个单一的对象。

我所拥有的ATM是这样的:

var poNumbers = ['12345', '67890']; 
return Promise.each(poNumbers, function (poNumber) { 
    return Promise.try(function() { 
     return getOrder(poNumber).then(function (order) { 
      console.log(order.poNumber, order.items[0].sku); 
      return order; 
     }); 
    }); 
}).then(function (combinedOrder) { 
    console.log(combinedOrder); 
}); 

但我不能确定如何每个订单的细节组合成一个单一的对象,并返回该对象的承诺呢?

该项目也使用lodash,我尝试使用_.difference也许抓住差异,并组成一个组合的订单对象,但我再次不确定如何得到它的工作。

实现上述目标的最佳方法是什么?

回答

0

你需要Promise.all,而不是Promise.each

docs报价:

给定一个可迭代(阵列是可迭代),或产生承诺的可迭代, 的承诺(或混合的承诺和值),迭代 将Iterable中的所有值迭代到数组中,并返回一个承诺 ,当数组中的所有项目都满足时,将履行该承诺。 承诺的履行值是一个数组,其履行值为 各自对原始数组的位置。如果 阵列中的任何承诺拒绝,则退回的承诺将被拒绝,并拒绝 原因。