J'ai donc une situation où j'ai plusieurs chaînes de promesses d'une longueur inconnue. Je veux qu'une action s'exécute lorsque toutes les CHAÎNES ont été traitées. Est-ce que c'est possible? Voici un exemple:
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);
});
Dans cet exemple, j'ai mis en place un $q.all()
pour les promesses un, deux et trois qui seront résolues à un moment aléatoire. J'ajoute ensuite des promesses aux extrémités de un et de trois. Je veux que le all
se résolve lorsque toutes les chaînes ont été résolues. Voici la sortie lorsque j'exécute ce code:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
Existe-t-il un moyen d'attendre que les chaînes se résolvent?
la source
Q.all
son exécution - sinon, cela devrait être trivial?$q.all
s, mais une fois que je lance le processus de résolution, aucune nouvelle action / promesse ne sera enchaînée.La réponse acceptée est correcte. Je voudrais donner un exemple pour l'élaborer un peu à ceux qui ne le connaissent pas
promise
.Exemple:
Dans mon exemple, je dois remplacer les
src
attributs desimg
balises par différentes URL miroir si disponibles avant de rendre le contenu.Explication:
À partir de la documentation AngularJS :
La
then
méthode:$ q.all (promesses)
Le
promises
paramètre peut être un tableau de promesses.À propos
bind()
, plus d'informations ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindla source
then
méthode de$q.all
est fournie un tableau des promesses renvoyées, vous pouvez donc boucler ce tableau et appelerthen
chaque élément du tableau, par opposition à l'appelthen
lorsque vous ajoutez la promesse àpromise_array
.Récemment eu ce problème mais avec un nombre inconnu de promesses. Résolu en utilisant jQuery.map () .
la source
Il y a un moyen.
$q.all(...
Vous pouvez vérifier les éléments ci-dessous:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
la source
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
bien?Vous pouvez utiliser "await" dans une "fonction asynchrone" .
REMARQUE: je ne suis pas sûr à 100% que vous puissiez appeler une fonction asynchrone à partir d'une fonction non asynchrone et obtenir les bons résultats.
Cela dit, cela ne sera jamais utilisé sur un site Web. Mais pour le test de charge / test d'intégration ... peut-être.
Exemple de code:
la source