Async: Version d'async.series où chaque tâche reçoit les résultats de toutes les tâches précédentes

Créé le 16 nov. 2015  ·  5Commentaires  ·  Source: caolan/async

Je rencontre fréquemment une situation où une tâche async.series a besoin des résultats de plusieurs tâches précédentes. async.waterfall est insuffisant car il ne fournit que le résultat de la dernière tâche précédente. async,auto est trop détaillé et fournit une déclaration de dépendance supplémentaire inutile.

Une nouvelle fonction (ou une amélioration de async.series) serait utile. Chaque tâche recevrait un objet de résultat contenant les résultats de toutes les tâches précédentes

Noms possibles : accumuler, sérieAccumuler

Exemple:

async.accumulate({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback, results){
        // results: {one: 1}
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    },
    three: function(callback, results){
         // results: {one: 1, two: 2}
        setTimeout(function(){
            callback(null, results.one + results.two);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2, three: 3}
});
feature question

Tous les 5 commentaires

Avez-vous vérifié async.auto ? Il fait quelque chose de très similaire à ce que vous décrivez.

Comme je l'ai mentionné, dans un scénario de série simple, async.auto est trop verbeux, l'utilisateur doit déclarer que chaque étape dépend de la précédente, ce qui entraîne ces tableaux laids et des noms d'étape en double.

async.auto({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: ["one", function(callback, results){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }],
    three: ["two", function(callback, results){
        setTimeout(function(){
            callback(null, results.one + results.two);
        }, 100);
    }
   ]
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2, three: 3}
});

Nous allons apporter quelques améliorations à auto dans la prochaine version majeure -- avoir toujours le rappel en dernier, et également ajouter autoInject (#608) qui induit les dépendances à partir des noms de paramètres.

Je n'aime pas cette proposition car elle repose sur l'ordre des clés d'objet - quelque chose qui n'est pas garanti dans les environnements JS (et n'est garanti que dans Node pour les petits objets). Avec des tableaux, c'est possible, mais c'est trop similaire à async.waterfall . Je ne suis pas sûr que nous ayons besoin de quelque chose entre auto et waterfall , surtout si nous ajoutons autoInject .

Un moyen d'accomplir ce que vous voulez :

function seriesAccumulate(tasks, done) {
  async.reduce(tasks, [], function (results, task, next) {
    task(results, function (err, result) {
      results.push(result);
      next(err, result);
    });
  }, done);
}

Je déconseille d'essayer d'utiliser un objet pour itérer en série.

En fermant ça. Je ne pense pas que nous ayons besoin d'une autre méthode entre series et waterfall dans le style.

Cette page vous a été utile?
0 / 5 - 0 notes