Un segundo intento de respuesta en el que trato de ser más explicativo:
Primero, algunos antecedentes necesarios, del README RSVP :
La parte realmente asombrosa llega cuando devuelve una promesa del primer controlador ... Esto le permite aplanar las devoluciones de llamada anidadas, y es la característica principal de las promesas que evita la "deriva hacia la derecha" en programas con mucho código asincrónico.
Así es precisamente como haces promesas secuenciales, devolviendo la promesa posterior del then
de la promesa que debería terminar antes.
Es útil pensar en un conjunto de promesas como un árbol, donde las ramas representan procesos secuenciales y las hojas representan procesos concurrentes.
El proceso de construir un árbol de promesas de este tipo es análogo a la tarea muy común de construir otros tipos de árboles: mantenga un puntero o referencia al lugar del árbol en el que está agregando ramas actualmente y agregue cosas de forma iterativa.
Como @Esailija señaló en su respuesta, si tiene una variedad de funciones de devolución de promesas que no aceptan argumentos, puede usar reduce
para construir ordenadamente el árbol para usted. Si alguna vez ha implementado reduce por sí mismo, comprenderá que lo que reduce detrás de escena en la respuesta de @ Esailija es mantener una referencia a la promesa actual ( cur
) y hacer que cada promesa devuelva la siguiente promesa en su then
.
Si NO tiene una buena matriz de funciones de devolución de promesas homogéneas (con respecto a los argumentos que toman / devuelven), o si necesita una estructura más complicada que una secuencia lineal simple, puede construir el árbol de promesas usted mismo manteniendo una referencia a la posición en el árbol de promesas donde desea agregar nuevas promesas:
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();
Puede crear combinaciones de procesos simultáneos y secuenciales utilizando RSVP.all para agregar múltiples "hojas" a una "rama" de promesa. Mi respuesta votada negativamente por ser demasiado complicada muestra un ejemplo de eso.
También puede usar Ember.run.scheduleOnce ('afterRender') para asegurarse de que algo hecho en una promesa se procese antes de que se active la siguiente; mi respuesta votada negativamente por ser demasiado complicada también muestra un ejemplo de eso.