Mo Hassan
Mo Hassan

Reputation: 175

for loop and promises

I have three methods (each is a promise) that does SELECT from the database.

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

For each deliverDate, I need to get the corresponding list of orders, and for each order I need to get the list of items. I will then build a JSONview to send to the client. To do that, I think I need to wrap the code above with a for loop, and presumably have a "global" object made of arrays etc.. and have to push to the object data from each method. I am not really sure if the approach will work. Can someone please tell me how to get it to work using the code above as an example.

Upvotes: 1

Views: 77

Answers (3)

yadhu
yadhu

Reputation: 15632

If what I understand is correct (as given in comments):

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))

Looks like you need a lot of API calls. Probably we should think about optimizing backend.

Upvotes: 0

Niezborala
Niezborala

Reputation: 1857

Better way to do that is use Promise.all:

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

Upvotes: 1

Shaun
Shaun

Reputation: 3895

Push all the promises into an array then use Promise.all to wait for all promises to finish and return the result. Something like

var promises = []

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

return Promise.all(promises);
  • Edit, all not when -- got my promise libraries confused

Upvotes: 1

Related Questions