Ein zweiter Versuch einer Antwort, in der ich versuche, erklärender zu sein:
Zunächst einige erforderliche Hintergrundinformationen aus der RSVP-README :
Der wirklich großartige Teil kommt, wenn Sie ein Versprechen vom ersten Handler zurückgeben ... Dies ermöglicht es Ihnen, verschachtelte Rückrufe zu reduzieren, und ist das Hauptmerkmal von Versprechungen, die ein "Rechtsdriften" in Programmen mit viel asynchronem Code verhindern.
Genau so machen Sie Versprechen nacheinander, indem Sie das spätere Versprechen von then
dem Versprechen zurückgeben, das davor enden sollte.
Es ist hilfreich, sich eine solche Reihe von Versprechungen als einen Baum vorzustellen, in dem die Zweige sequentielle Prozesse und die Blätter gleichzeitige Prozesse darstellen.
Der Prozess des Aufbaus eines solchen Baums von Versprechungen ist analog zu der sehr häufigen Aufgabe, andere Arten von Bäumen zu bauen: Behalten Sie einen Zeiger oder Verweis darauf bei, wo in dem Baum Sie gerade Zweige hinzufügen, und fügen Sie iterativ Dinge hinzu.
Wie @Esailija in seiner Antwort betonte, können Sie reduce
den Baum ordentlich erstellen , wenn Sie über eine Reihe von Funktionen verfügen, die Versprechen zurückgeben und keine Argumente enthalten . Wenn Sie Reduce jemals für sich selbst implementiert haben, werden Sie verstehen, dass Reduce hinter den Kulissen in @ Esailijas Antwort darin besteht, einen Verweis auf das aktuelle Versprechen ( cur
) beizubehalten und jedes Versprechen das nächste Versprechen in seinem zurückgeben zu lassen then
.
Wenn Sie KEINE schöne Reihe homogener (in Bezug auf die Argumente, die sie annehmen / zurückgeben) Versprechen zurückgebender Funktionen haben oder wenn Sie eine kompliziertere Struktur als eine einfache lineare Sequenz benötigen, können Sie den Baum der Versprechen selbst erstellen, indem Sie ihn beibehalten Ein Verweis auf die Position im Versprechungsbaum, an der Sie neue Versprechungen hinzufügen möchten:
var root_promise = current_promise = Ember.Deferred.create();
current_promise = current_promise.then(function(){
return
});
current_promise = current_promise.then(function(){
return
});
root_promise.resolve();
Sie können Kombinationen von gleichzeitigen und sequentiellen Prozessen erstellen, indem Sie RSVP.all verwenden, um einem versprochenen "Zweig" mehrere "Blätter" hinzuzufügen. Meine Antwort, die als zu kompliziert eingestuft wurde, zeigt ein Beispiel dafür.
Sie können auch Ember.run.scheduleOnce ('afterRender') verwenden, um sicherzustellen, dass etwas, das in einem Versprechen getan wurde, gerendert wird, bevor das nächste Versprechen ausgelöst wird. Meine Antwort, die als zu kompliziert eingestuft wurde, zeigt auch ein Beispiel dafür.