2015-11-20 126 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中的所有值迭代到數組中,並返回一個承諾 ,當數組中的所有項目都滿足時,將履行該承諾。 承諾的履行值是一個數組,其履行值爲 各自對原始數組的位置。如果 陣列中的任何承諾拒絕,則退回的承諾將被拒絕,並拒絕 原因。