2014-03-28 4 views
5

Ich verwende Restangular, um mehrere gleichzeitige Anrufe an den Server zu tätigen. Restanguläre Renditen versprechen für jede Aktion, jeder von ihnen muss etwas mit seiner spezifischen Rückkehr tun, und sobald alle 3 abgeschlossen sind und ihre .then Funktionen abgeschlossen sind, muss ich eine andere Funktion ausführen.Warten auf mehrere Versprechen als Gruppe und einzeln in eckigen?

Ist dies der richtige Weg, Versprechen in diesem Fall zu machen?

var a, b, c; 

a = service1.getList(...).then(function A(data) { do something; $log.debug('a'); return 'a';}); 
b = service2.getList(...).then(function B(data) { do something; $log.debug('b'); return 'b';}); 
c = service3.getList(...).then(function C(data) { do something; $log.debug('c'); return 'c';}); 

$q.all([a,b,c]).then(function wrapUp(values) { $log.debug(values); do something after functions A, B,and C above have finished;} 

Ich weiß nicht, ob $ q.all() am Ende von A, B und C durchgeführt wird, oder wenn es vor der letzten Funktion laufen kann. Wird wrapUp() IMMER zuletzt aufgerufen?

Beachten Sie, dass A, B und C die Funktionen sind, die nach den Versprechungen a, b und c aufgerufen werden. Das Werte-Array, das an wrapUp übergeben wurde, scheint die Rückgabewerte von A, B und C zu sein. In meiner Konsole werden jedoch 10 Mal Funktionen A protokolliert, und dann 10 Mal Funktion B, dann Funktion C und Funktion wrapUp protokollieren beide 10 Mal (abwechselnd).

Die 10x Protokollierung scheint wie etwas gebrochen ist ....., und die gefürchtete Race-Bedingung scheint eine Möglichkeit zu sein ....

Kann jemand erklären, was hier vor sich geht?

Chrome Dev Console

+0

Ich habe dein Szenario getestet und es funktioniert sehr gut, es sollte eine andere Situation geben, wie löst man diese aus, vielleicht sollten wir das untersuchen? Hier ist Ihr Szenario in der Restangular-Vorlage http://plnkr.co/edit/Wp0FEVz8iwOyXf84pZ8h?p=preview –

+0

ng-Grid scheint der Übeltäter zu sein, Irgendwie obwohl dieser Handler 10 Mal aufgerufen wird, sendet restangular nur 3 Anfragen an den Webserver (wie erwartet) Die 10 Antworten für jeden der Versuche. Kombiniert der Restangular Requests, die identisch sind, und fügt sie nur dem Versprechen hinzu, das sie der ersten Anfrage zurück gegeben hat? – boatcoder

Antwort

7

Ist dies der richtige Weg verspricht in diesem Fall zu tun?

Ja, ist es.

Die 10x Protokollierung scheint wie etwas gebrochen ist ....., und die gefürchtete Race-Bedingung scheint eine Möglichkeit zu sein ....

Kann jemand erklären, was hier vor sich geht?

Es ist eigentlich nicht kaputt. Wie Sie vorschlagen $q.all wartet auf alle Versprechungen zu vervollständigen.

In:

$q.all([a,b,c,d]).then(function(){ 
    // yes, this only runs after all of the promises fulfilled 
}); 

Hier ist, was passiert:

Sie haben eine Schleife, die 10-mal ausgeführt wird:

  • A aus der gesamten Schleife ruft alle sofort erfüllen.
  • B Anrufe von der gesamten Schleife alle sofort erfüllen.
  • C-Aufruf
    • das Versprechen der $q.all für diese Instanz aus a löst, b, c für die eine (bereits beschlossen) die b (bereits beschlossen) und jetzt die c - erfüllt.
  • Weiter c Aufruf löst
    • Das Versprechen, bestehend aus den $q.all für diese Instanz von a, b, c für das ein (bereits beschlossen) die b (bereits beschlossen) und jetzt die c - erfüllt.

Und so weiter.

Die einzige Garantie Sie haben, ist, dass innerhalb der Schleife der Instanz von $q.all([a,b,c] nach seinem lokalen a, b und c erfüllen wird. Nichts anderes, nichts mehr.

Wenn Sie die Gesamtversprechen aller Rückgabewerte anhängen möchten, können Sie natürlich eine $q.all auf alle zehn von ihnen durchführen.

+0

Ich wollte sagen, ich habe keine Schleife, weil ich nur 3 Netzwerkanrufe mache, aber ich ging zurück und fügte Protokollierung der Funktion hinzu, die diese dreifache Versprechen macht und siehe da ng-Grid ruft meine Änderungsfunktion 10 mal mit rowItem auf .selected ...... Irgendwie, selbst wenn mein Zeilenwechsel-Handler 10-mal hintereinander angerufen wird, mache ich nur 3 Netzwerkanrufe ......., bekomme aber 10 "erfolgreiche Antworten". – boatcoder

+0

Ja, ng-Grid ist der Schuldige in der 10-fachen Sache hier. Hat damit zu tun, wie sie ngGridEventData behandeln und mehrere Male für einen einzelnen Austausch einer Array-Quelle auslösen. – boatcoder

+0

Das ist wahrscheinlich der eckige Cache bei der Arbeit, Sie können es ausschalten :) –