Iteriere über ein Array, wenn forEach-Schleife fertig ist

7

Ich versuche, über ein Array, das ich aus mehreren http-Aufrufen innerhalb eines angular.forEach()

konstruiere, zu iterieren

die Funktion

%Vor%

Die letzte Zeile $scope.data_set.push() funktioniert, erhöht sich aber im Laufe der Zeit, wenn Aufrufe Daten zurückgeben. Ich möchte, dass diese Zeile ausgeführt wird, sobald alles innerhalb der for Each-Schleife erledigt ist. Ich muss über das Array $scope.closed_tickets iterieren, um (zusätzliche) Daten darin zu spielen und ein zweites Array aufzubauen.

Hier sind die Dienste, die in dieser Funktion verwendet werden:

%Vor%

Ich suche nach Informationen und erfuhr den $q.all() Service, habe es aber nicht geschafft, das so zu machen, wie ich es möchte.

Alle Ratschläge wären willkommen! Danke!

    
SKYnine 01.04.2015, 19:30
quelle

3 Antworten

21

Sie können $ q.all verwenden, um auf mehrere anonyme Ereignisse (Versprechen) zu warten, um abzuschließen.

%Vor%

Erstens steht deferred für einen Codeabschnitt, der eine unbekannte Ausführungszeit benötigt (asynchron). deferred.resolve(data) gibt einfach an, dass der Code beendet ist. Daten können alles sein, ein Objekt, eine Zeichenfolge oder was auch immer, aber normalerweise sind es die Ergebnisse Ihres asynchronen Codes. Ebenso können Sie ein Versprechen mit deferred.reject(data) ablehnen (vielleicht wurde vom Server ein Fehler ausgelöst). Auch hier können Daten alles Mögliche sein, aber hier sollte es wohl die Fehlerreaktion sein.

deferred.promise gibt nur ein Zusicherungsobjekt zurück. Mit dem Promise-Objekt können Sie Callbacks wie .then(successFunction, errorFunction) festlegen, sodass Sie wissen, dass ein Codeabschnitt fertig ausgeführt wurde, bevor Sie zu successFunction (oder errorFunction im Falle eines Fehlers) weitergehen. In unserem Fall hat $q die .all -Methode, die auf ein Array von Versprechungen wartet, die abgeschlossen werden sollen, und gibt Ihnen dann die Ergebnisse aller Versprechen als Array.

Vergessen Sie nicht, den Dienst $q zu injizieren.

    
csbarnes 01.04.2015, 20:06
quelle
1

Versuchen Sie, eine Reihe von Versprechen nur zu machen, ohne sie noch zu lösen. Dann aggregiere sie mit $ q.all (). Nach der aggregierten Versprechen Lösung durchlaufen Sie das Array dieser Versprechen erneut. Jetzt sind Sie sicher, dass sie alle aufgelöst sind.

%Vor%

Vielleicht ist das nicht der effizienteste Weg, dies zu tun, aber ich denke, das sollte Ihr Problem lösen.

    
miszczak 01.04.2015 20:09
quelle
1

Auch wenn Sie erwähnen, dass $ q.all für Sie nicht funktioniert hat, weil ich nicht verstehe, warum das nicht so ist, so würde ich das tun.

Im Grunde möchten Sie ein Array von Dingen (Zeitstempel) einigen anderen Dingen zuordnen (verspricht in diesem Fall, da wir Async-Aufrufe haben) und eine Aktion für das resultierende Array durchführen.

%Vor%

Jetzt verwenden wir $q.all , um auf alle zu lösenden Versprechen zu warten:

%Vor%     
getOffMyLawn 01.04.2015 20:10
quelle

Tags und Links