2017-12-26 8 views
0

Ich versuche zu antworten, nachdem eine Zusage innerhalb einer for-Schleife abgeschlossen ist.Javascript warte darauf, dass Promise innerhalb von for-loop abgeschlossen wird, bevor Antwort zurückgegeben wird

Ich habe thesequestions betrachtet, aber sie adressieren meine Situation nicht.

Die Methoden GetOrders und MethodGetLines sind Teil einer externen Bibliothek, die ich verwenden muss. Sie machen beide Netzwerkanrufe, daher gibt es eine gewisse Verzögerung. Die Funktion gibt immer eine '0' zurück, da sie nicht auf das innere Versprechen wartet. Ich weiß, dass es keine Möglichkeit gibt, auf das Versprechen zu warten, aber wie bekomme ich den richtigen Zählerwert in der Antwort?

doWorkMainFunction() { 
    methodGetOrders() 
    .then(orderList => { 
     var counter=0; 
     for (var i=0; i< orderList.length; i++) { 
     methodGetLines() 
      .then (lineData => { 
       if (someCondition) { counter++; } 
      } // end of inner THEN 
     } // end FOR loop 
     return counter; // This always returns '0' 
    } // end of outer THEN 
} 

Antwort

2

Erstellen Sie ein Array aller Verheißungen in der Schleife und dann Promise.all() verwenden, um Rück Zähler nach all den Versprechungen

methodGetOrders() 
    .then(orderList => { 
    var counter = 0; 

    var promises = orderList.map(order => { 
     return methodGetLines() 
     .then(lineData => { 
      if (someCondition) { 
      counter++; 
      } 
     }) // end of inner THEN 
    }) // end promise map 
    return Promise.all(promises).then(_ => counter); 
    }) // end of outer THEN 
}) 
+0

Leider gelöst haben, ich bin ziemlich neu in JavaScript, so dass ich sein will etwas klarstellen: Es gibt zwei Return-Anweisungen im Code? Ist das erlaubt? – banncee

+0

Sie können so viele Rückmeldungen haben, wie Sie möchten. Die hier sind sogar in verschiedenen Funktionen. – Tomalak

+1

Der erste 'return' ist innerhalb [' Array # map'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map), um es jedem Array-Element zu geben was ist eine Verheißung, die von 'methodGetLines()' ... zurück gegeben wird, kehrt zu 'methodGetOrders' zurück. – charlietfl

Verwandte Themen