2013-01-05 10 views
7

ich ein Versprechen von einer Funktion wie diese bin Rückkehr:Warten Sie, bis Versprechen und verschachtelte thens abgeschlossen sind

resultPromise = dgps.utils.save(opportunity, '/api/Opportunity/Save', opportunity.dirtyFlag).then(function() { 

       self.checklist.saveChecklist(opportunity).then(function() { 

        self.competitor.save(opportunity.selectedCompetitor()).then(function ... etc. 
return resultPromise; 

Lassen Sie uns die oben sagen Funktion speichern aufgerufen wird.

In der aufrufenden Funktion möchte ich warten, bis die gesamte Kette abgeschlossen ist und dann etwas tun. Mein Code sieht es wie folgt aus:

var savePromise = self.save(); 
savePromise.then(function() { 
    console.log('aftersave'); 
}); 

Das Ergebnis ist, dass ‚aftersave‘ ist an die Konsole senden, während die Kette der Versprechungen noch läuft.

Wie kann ich etwas tun, nachdem die ganze Kette abgeschlossen ist?

Antwort

7

Anstatt die Versprechen zu verschachteln, verketten Sie sie.

resultPromise = dgps.utils.save(opportunity, '/api/Opportunity/Save', opportunity.dirtyFlag).then(function() { 

        return self.checklist.saveChecklist(opportunity); 
       }).then(function() { 

        return self.competitor.save(opportunity.selectedCompetitor()); 
       }).then(function() { 
        // etc 
       }); 

// return a promise which completes when the entire chain completes 
return resultPromise; 
+2

Was ist, wenn da eine Bedingung ist? Brauchst du das verzögerte Objekt nicht? – FlavorScape

+0

Dies ist nicht die Antwort auf die Frage gestellt. Die Frage war, wie man auf das Ende der Kette warten sollte. Einfach mehr Elemente zur Kette hinzuzufügen ist keine Lösung und wird oft nicht richtig funktionieren. – MeanEYE

+0

@MeanEYE Sie warten t für die Kette zu beenden, indem Sie ein 'then' an der Kette tun. Dies löst das Problem (obwohl, wie Sie angemerkt haben, es nicht die wörtliche Frage beantwortet, sondern die Frage war wirklich über ein Problem). –