为循环和承诺

我有三个方法(每个都是一个承诺),从数据库中做SELECT。

getDeliverDate() .then(calculateOrderList) .then(getOrderItemsForOrder) 

对于每个deliverDate,我需要得到相应的订单列表,并且我需要获取每个订单的项目清单。 然后我将构build一个JSONview发送给客户端。 要做到这一点,我想我需要用for循环包装上面的代码,并且大概有一个由数组等构成的“全局”对象,并且必须从每个方法中推送到对象数据。 我不太确定这种方法是否可行。 有人可以告诉我如何使用上面的代码作为一个例子来工作。

将所有的承诺推入一个数组,然后使用Promise.all等待所有承诺完成并返回结果。 就像是

 var promises = [] for (...) { promises.push(getDeliverDate() .then(calculateOrderList) .then(getOrderItemsForOrder)); } return Promise.all(promises); 
  • 编辑, all不是when – 让我的承诺库困惑

更好的方法是使用Promise.all

 Promise.all([getDeliverDate, calculateOrderList, getOrderItemsForOrder]) .then(values => { console.log(values); }); 

如果我的理解是正确的(如评论中所述):

 getDeliverDate() // get array of delivery dates .then((deliveryDates = []) => { // for each delivery date, I need to get corresponding list of orders const promises = deliveryDates.map(date => calculateOrderList(date)); return Promise.all(promises); }) // get order list as an array .then((orderList = []) => { // for each order I need to get list of items corresponding to that order const promises = orderList.map(order => getOrderItemsForOrder(order)); return Promise.all(promises); }) // get item list as an array .then((items) => console.log('got everything : ', items)) .catch((error) => console.log('error : ', error)) 

看起来你需要很多的API调用。 可能我们应该考虑优化后端。