2016-11-29 5 views
1

Ich habe drei Methoden (jede ist ein Versprechen), die SELECT aus der Datenbank tut.für Schleife und Versprechen

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

Für jede deliverDate, ich brauche die entsprechende Liste der Aufträge zu bekommen, und für jede Bestellung muss ich die Liste der Elemente erhalten. Ich werde dann ein JSONview erstellen, um es an den Client zu senden. Um das zu tun, denke ich, dass ich den Code oben mit einer for-Schleife umschließen muss, und vermutlich ein "globales" Objekt, das aus Arrays usw. besteht. Und muss von jeder Methode zu den Objektdaten gelangen. Ich bin mir nicht sicher, ob der Ansatz funktionieren wird. Kann mir bitte jemand sagen, wie man es mit dem obigen Code als Beispiel zur Arbeit bringt?

Antwort

1

Schieben Sie alle Versprechen in ein Array, und warten Sie mit Promise.all ab, bis alle Versprechen abgeschlossen sind, und geben Sie das Ergebnis zurück. So etwas wie

var promises = [] 

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

return Promise.all(promises); 
  • bearbeiten, all nicht when - bekam mein Versprechen Bibliotheken
  • verwirrt
1

bessere Weise zu tun, ist die Verwendung Promise.all:

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

Wenn das, was ich verstehe, ist richtig (wie in den Kommentaren angegeben):

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

Sieht aus wie Sie eine Menge API-Aufrufe benötigen. Wahrscheinlich sollten wir darüber nachdenken, das Backend zu optimieren.

+0

Danke euch allen, @ free-soul, ich führe sql-Abfragen hinter den drei Methoden aus und gebe ein neues Versprechen ab. wie folgt getDeliverDates() gibt neues Promise zurück. Um Ihren Code anzupassen, muss ich das neue Versprechen entfernen und den von Ihnen bereitgestellten Promise.all-Code verwenden. Ist das richtig? –

+0

Nein, Sie müssen keine Ihrer vorhandenen Methoden berühren. –