Comment puis-je exécuter tableau de promesses dans l'ordre?
J'ai un tableau de promesses qui doivent s'exécuter dans un ordre séquentiel.
var promises = [promise1, promise2, ..., promiseN];
L'appel de RSVP.tous les exécutera en parallèle:
RSVP.all(promises).then(...);
Mais, comment puis-je exécuter dans l'ordre?
Je peux manuellement pile comme ça
RSVP.resolve()
.then(promise1)
.then(promise2)
...
.then(promiseN)
.then(...);
mais le problème est que le nombre de promesses varie et un ensemble de promesses se construit dynamiquement.
- d'autres réponses et downvotes sur la mienne, il semble de plus en plus les gens ont besoin de lire le rsvp README où il explique "Le vraiment génial vient que lorsque vous revenez à une promesse du premier gestionnaire". Si vous ne faites pas cela, vous êtes vraiment absent dehors sur le pouvoir expressif de promesses.
- Question similaire, mais pas de cadre spécifique: stackoverflow.com/q/24586110/245966
Vous devez vous connecter pour publier un commentaire.
Si vous les avez déjà dans un tableau alors qu'ils sont déjà en cours d'exécution. Si vous avez une promesse alors qu'il est déjà en cours d'exécution. Ce n'est pas une préoccupation des promesses (I. E ils ne sont pas comme C#
Task
s dans ce domaine.Start()
méthode)..all
ne pas exécuter quoi que ce soitelle renvoie simplement une promesse.
Si vous avez un tableau de la promesse de revenir fonctions:
Ou valeurs:
reduce
il m'a fallu un moment pour comprendre le premiercur
est résolu promesse. Basé sur que j'ai réussi à faire celui qui exécute promesses jusqu'à ce que l'un d'eux réussisse. Juste de l'ajouter ici au cas où quelqu'un le trouve utile..then
, dans cet exemple, il est tout simplement ignoré...If you already have them in an array then they are already executing
N'a pas seulement mis en gras et en taille plus grande. Ce besoin d'aller à la MDN page de documentation.Avec ECMAScript 2017 async fonctions qu'il serait fait comme ceci:
Vous pouvez utiliser BabelJS à utiliser asynchrone fonctionne maintenant
ES7 voie en 2017.
Cela permettra d'exécuter les fonctions de manière séquentielle(un par un), et non pas en parallèle. Le paramètre
promises
est un tableau de fonctions, qui renvoientPromise
.Plunker exemple avec le code ci-dessus: http://plnkr.co/edit/UP0rhD?p=preview
Une deuxième tentative de réponse dans lequel j'essaie d'être plus explicatif:
Tout d'abord, certains de base nécessaires, à partir de la RSVP README:
C'est précisément comment vous faire des promesses séquentielle, par le retour de la plus tard, la promesse de la
then
de la promesse qui devrait se terminer avant elle.Il est utile de penser à un tel ensemble de promesses que d'un arbre, où les branches représentent les processus séquentiels, et les feuilles représentent les processus simultanés.
Le processus d'édification d'un tel arbre de promesses, est analogue à la très commune de la tâche de construction d'autres sortes d'arbres: maintenir un pointeur ou une référence à l'emplacement dans l'arborescence, vous êtes actuellement à l'ajout de branches, et de manière itérative ajouter des choses.
Comme @Esailija a souligné, dans sa réponse, si vous avez un tableau de la promesse-de retour des fonctions qui ne prennent pas les arguments que vous pouvez utiliser
reduce
à proprement construire l'arbre pour vous. Si vous avez déjà mis en œuvre pour réduire vous-même, vous comprendrez que ce qui est de réduire de faire les coulisses de @Esailija la réponse est le maintien de la référence à l'actuel promesse (cur
) et chaque promesse de revenir la prochaine promettre en sathen
.Si vous N'avez PAS un joli tableau de l'homogène (à l'égard des arguments qu'ils prennent/retour) promesse de retour des fonctions, ou si vous avez besoin d'une structure plus complexe qu'une simple séquence linéaire, on peut construire l'arbre des promesses à vous-même par le maintien d'une référence à la position dans la promesse de l'arbre où vous voulez ajouter de nouvelles promesses:
Vous pouvez construire des combinaisons de simultanée et séquentielle des processus en utilisant RSVP.tout pour ajouter plusieurs "feuilles" une promesse "de branche". Mon downvoted-pour-être-trop-compliqué réponse montre un exemple de cela.
Vous pouvez également utiliser de Braise.exécuter.scheduleOnce('afterRender') pour que quelque chose soit fait à une promesse est rendu avant la prochaine promesse est tiré -- mon downvoted-pour-être-trop-compliqué réponse montre aussi un exemple de cela.
then
est souhaité, vous avez donné beaucoup d'informations supplémentaires qui se cache la réponse à la question qui a été posée.Promise.resolve().then(...).then(...)...
, pas que le tableau était de plus en plus pendant les promesses ont été en cours d'exécution. Bien sûr, il est tout à fait discutable maintenant.Je vais laisser cette réponse ici, car ce serait m'ont aidé quand je suis venu ici à la recherche d'une solution à mon problème.
La chose que je recherchais était essentiellement mapSeries... et il m'arrive d'être de cartographie enregistrer sur un ensemble de valeurs... et je veux les résultats...
Donc, ici, est aussi loin que j'ai eu, FWIW, pour aider les autres à la recherche pour des choses similaires dans le futur....
(À noter que le contexte est une braise app)
Tout ce qui est nécessaire pour résoudre les qui est un
for
boucle 🙂J'ai eu le même problème, et j'ai fait une fonction récursive qui exécute les fonctions une par une de manière séquentielle.
Dans le cas où vous avez besoin de collecter de sortie de ces fonctions: