Comment chaîner séquentiellement les promesses avec angularjs $ q?
Dans la promesse de la bibliothèque Qvous pouvez effectuer les opérations suivantes de façon séquentielle de la chaîne de promesses:
var items = ['one', 'two', 'three'];
var chain = Q();
items.forEach(function (el) {
chain = chain.then(foo(el));
});
return chain;
cependant, la suivante ne fonctionne pas avec $q:
var items = ['one', 'two', 'three'];
var chain = $q();
items.forEach(function (el) {
chain = chain.then(foo(el));
});
return chain;
source d'informationauteur redgeoff | 2014-09-06
Vous devez vous connecter pour publier un commentaire.
Redgeoff, votre réponse est la façon dont je utilisé pour traduire un tableau en chaîne de la série de promesses.
La découverte de la de facto motif est comme suit :
Notes:
.reduce
est cru javascript, pas partie d'une bibliothèque.result
est la précédente async résultat/de données et est inclus pour l'intégralité. La premièreresult
estinitialValue
. Si il n'est pas nécessaire de passer, puis il suffit de le laisser dehors.$q.when(initialValue)
selon la promesse lib vous utilisez.doSomethingAsync
estfoo
(ou ce que foo() retourne?) - dans tous les cas, à une fonction.Si vous êtes comme moi, alors le modèle d'oeil, à première vue, comme un mur impénétrable cludge mais une fois que votre œil se met à l'unisson, vous allez commencer à le considérer comme un vieil ami.
Modifier
Voici un démoconçu pour démontrer que le modèle recommandé ci-dessus, dans les faits, l'exécution de ses
doSomethingAsync()
appels de façon séquentielle, pas immédiatement lors de la construction de la chaîne, comme suggéré dans les commentaires ci-dessous.Simplement utiliser le q$.lorsque la (les) fonction:
Remarque: foo doit être une usine, par exemple,
Avoir ceci:
Une ligne (bien, 3 pour des raisons de lisibilité):
Je préfère préparer des fonctions qui retournent des promesses à l'aide de
angular.bind
(ouFunction.prototype.bind
) et ensuite de les relier en une chaîne à l'aide de réduire raccourci. Par exempleVotre réponse est correcte. Cependant, j'ai pensé que je voudrais vous proposer une alternative. Vous pouvez être intéressé par q$.série si vous vous trouvez en série chaînage des promesses souvent.
Peut-être d'une manière plus simple que redgeoff réponsesi vous n'en avez pas besoin automatisé, vous pouvez enchaîner les promesses à l'aide de
$q.when()
combiné avec.then()
comme indiqué dans le début de ce post.return $q.when()
.then(function(){ return promise1; })
.then(function(){ return promise2; });