for loop和promise

时间:2016-11-29 13:31:28

标签: javascript node.js

我有三个方法(每个都是一个promise)从数据库中执行SELECT。

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

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

3 个答案:

答案 0 :(得分:1)

将所有promises推送到数组中,然后使用Promise.all等待所有promise完成并返回结果。像

这样的东西
var promises = []

for (...) {
    promises.push(getDeliverDate()
           .then(calculateOrderList)
           .then(getOrderItemsForOrder));
}

return Promise.all(promises);
  • 编辑,all而非when - 让我的承诺图书馆感到困惑

答案 1 :(得分:1)

更好的方法是使用Promise.all

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

答案 2 :(得分:0)

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

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调用。可能我们应该考虑优化后端。