Entonces tengo una situación en la que tengo múltiples cadenas de promesas de longitud desconocida. Quiero que se ejecute alguna acción cuando se hayan procesado todas las CADENAS. ¿Es eso siquiera posible? Aquí hay un ejemplo:
app.controller('MainCtrl', function($scope, $q, $timeout) {
var one = $q.defer();
var two = $q.defer();
var three = $q.defer();
var all = $q.all([one.promise, two.promise, three.promise]);
all.then(allSuccess);
function success(data) {
console.log(data);
return data + "Chained";
}
function allSuccess(){
console.log("ALL PROMISES RESOLVED")
}
one.promise.then(success).then(success);
two.promise.then(success);
three.promise.then(success).then(success).then(success);
$timeout(function () {
one.resolve("one done");
}, Math.random() * 1000);
$timeout(function () {
two.resolve("two done");
}, Math.random() * 1000);
$timeout(function () {
three.resolve("three done");
}, Math.random() * 1000);
});
En este ejemplo, configuro una $q.all()
para las promesas uno, dos y tres que se resolverán en algún momento aleatorio. Luego agrego promesas en los extremos de uno y tres. Quiero all
que se resuelva cuando se hayan resuelto todas las cadenas. Aquí está la salida cuando ejecuto este código:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
¿Hay alguna forma de esperar a que se resuelvan las cadenas?
angularjs
promise
angular-promise
jensengar
fuente
fuente
Q.all
se ejecutó? De lo contrario, debería ser trivial?$q.all
mensajes de correo electrónico, sin embargo, una vez que comience el proceso de resolución, no se encadenarán nuevas acciones / promesas.La respuesta aceptada es correcta. Me gustaría dar un ejemplo para desarrollarlo un poco a quienes no estén familiarizados
promise
.Ejemplo:
En mi ejemplo, necesito reemplazar los
src
atributos de lasimg
etiquetas con diferentes URL espejo si están disponibles antes de renderizar el contenido.Explicación:
De los documentos de AngularJS :
El
then
método:$ q.all (promesas)
El
promises
parámetro puede ser una serie de promesas.Acerca de
bind()
, Más información aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindfuente
then
método de$q.all
proporciona una matriz de las promesas devueltas, por lo que puede repetir esa matriz y llamarthen
a cada elemento de la matriz, en lugar de llamarthen
cuando agrega la promesa apromise_array
.Recientemente tuve este problema pero con un número desconocido de promesas. Resuelto usando jQuery.map () .
fuente
Hay una manera.
$q.all(...
Puede consultar las siguientes cosas:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
fuente
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
bien.Puede utilizar "await" en una "función asíncrona" .
NOTA: No estoy 100% seguro de que pueda llamar a una función asíncrona desde una función no asíncrona y obtener los resultados correctos.
Dicho esto, esto nunca se usaría en un sitio web. Pero para la prueba de carga / prueba de integración ... tal vez.
Código de ejemplo:
fuente