将多个Bluebird promises组合成一个promise对象

时间:2015-11-20 20:32:47

标签: javascript

我正在使用BluebirdJS承诺库。

我有一个名为getOrder的方法,它以promise的形式返回订单详细信息。

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来获取差异并组成一个组合订单对象,但我再次不确定如何让它工作。

实现上述目标的最佳途径是什么?

1 个答案:

答案 0 :(得分:0)

您需要Promise.all而不是Promise.each

引用docs

  

给定Iterable(数组是Iterable),或Iterable的承诺,   它产生承诺(或承诺和价值的混合),迭代   将Iterable中的所有值转换为数组并返回一个promise   当满足数组中的所有项目时,就会实现这一点。该   promise的履行值是一个履行值为的数组   原始数组的相应位置。如果有任何承诺   数组拒绝,返回的承诺被拒绝拒绝   原因。