Faire angular.forEach attendre la promesse après aller à l'objet suivant
J'ai une liste d'objets. Les objets sont passés à un différé de fonction. Je veux appeler la fonction avec l'objet suivant seulement après l'appel précédent est résolu. Est il possible que je puisse faire cela?
angular.forEach(objects, function (object) {
//wait for this to resolve and after that move to next object
doSomething(object);
});
source d'informationauteur Razvan
Vous devez vous connecter pour publier un commentaire.
Avant ES2017 et
async/await
(voir ci-dessous pour une option dans ES2017), vous ne pouvez pas utiliser.forEach()
si vous voulez attendre pour une promesse, car les promesses ne sont pas de blocage. Javascript et les promesses ne fonctionnent tout simplement pas de cette façon.Vous pouvez enchaîner plusieurs promesses et de faire la promesse de l'infrastructure de la séquence.
Vous pouvez parcourir manuellement et à l'avance le nombre d'itérations effectuées que lorsque la précédente promettent de finitions.
Vous pouvez utiliser une bibliothèque comme
async
ouBluebird
qui va de la séquence pour vous.Il ya beaucoup de différentes options, mais
.forEach()
va pas le faire pour vous.Voici un exemple de séquence en utilisant le chaînage des promesses angulaire promesses (en supposant que
objects
est un tableau):Et, en utilisant la norme ES6 promesses, ce serait:
Voici un exemple de manuellement séquençage (en supposant que
objects
est un tableau), si ce n'est pas un rapport d'achèvement ou d'erreurs, telles que l'option ci-dessus n':ES2017
Dans ES2017, le
async/wait
fonctionnalité ne vous permettent d ' "attendre" une promesse à remplir avant de continuer la boucle d'itération lors de l'utilisation de la non-fonction de base de boucles commefor
ouwhile
:Le code doit être contenue à l'intérieur d'un
async
fonction et ensuite vous pouvez utiliserawait
à dire que l'interprète d'attendre la promesse à résoudre avant de continuer la boucle. Remarque, si cela semble être un "blocage" type de comportement, il n'est pas le blocage de la boucle d'événements. D'autres événements dans la boucle d'événements peuvent encore être traitées, lors de laawait
.Oui, vous pouvez utiliser
angular.forEach
pour atteindre cet objectif.Voici un exemple (en supposant
objects
est un tableau):Ici est de savoir comment cela peut être fait en utilisant
array.reduce
similaire à @friend00 de réponse (en supposant queobjects
est un tableau):vérifier que $q sur angulaire:
La façon la plus simple est de créer une fonction manuellement et de parcourir tous les objets dans le tableau après chaque promesse est résolu.
Exemple est également disponible sur mon GitHub:
https://github.com/pietervw/Deferred-Angular-FOR-Loop-Example
Il pourrait aider quelqu'un que j'ai essayé plusieurs solution ci-dessus avant de venir avec mon propre qui a effectivement travaillé pour moi (les autres n'ont pas)
Il a travaillé pour moi comme ça. Je ne sais pas si c'est une bonne approche, mais pourrait aider à réduire des lignes