web-dev-qa-db-fra.com

Comment enchaîner l'exécution d'un tableau de fonctions lorsque chaque fonction renvoie deferred.promise?

J'ai créé mon premier objet différé dans Node.js en utilisant le module différé et cela fonctionne très bien lorsque je passe le résultat à la fonction suivante et déclenche la résolution et le rejet.Comment enchaîner l'exécution d'un tableau de fonctions lorsque chaque fonction renvoie deferred.promise? J'ai comme un tableau de paramètres d'entrée de fonctions et un paramètre d'entrée pour la première fonction et chaque fonction suivante obtient le paramètre du précédent.

Cela fonctionne comme f1(100).then(f2).then(f3), mais comment quand j'ai n nombre de fonctions.

37
PaolaJ.

Vous devez créer une chaîne de promesses en boucle:

var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
    promise = promise.then(funcs[i]);
44
SLaks

Même idée, mais vous pouvez le trouver légèrement plus classe ou plus compact:

funcs.reduce((prev, cur) => prev.then(cur), starting_promise);

Si vous n'avez pas de starting_promise Spécifique que vous souhaitez utiliser, utilisez simplement Promise.resolve().

76
user663031

En nous appuyant sur @torazaburo, nous pouvons également ajouter un "chemin malheureux"

funcs.reduce(function(prev, cur) {
  return prev.then(cur).catch(cur().reject);
}, starting_promise); 
6
Simon H

ES6, permettant des arguments supplémentaires:

function chain(callbacks, initial, ...extraArgs) {
 return callbacks.reduce((prev, next) => {
   return prev.then((value) => next(value, ...extraArgs));
 }, Promise.resolve(initial));
}
5
jchook

Manière ES7 en 2017. http://plnkr.co/edit/UP0rhD?p=preview

  async function runPromisesInSequence(promises) {
    for (let promise of promises) {
      console.log(await promise());
    }
  }

Cela exécutera les fonctions données séquentiellement (une par une), pas en parallèle. Le paramètre promises est une collection de fonctions (PAS Promises), qui renvoient Promise.

4
allenhwkim

Pour un tableau funcs vide possible:

var promise =  $.promise(function(done) { done(); });
funcs.forEach(function(func) {
  promise = promise.then(func);         
});
0
GKislin