Nodejs async series – Passer des arguments au prochain rappel

Lorsque vous utilisez un module asynchrone, comment pouvez-vous transmettre les arguments du rappel précédent à la suivante?

Voici un exemple des docs sur github

async.series({ one: function(callback){ setTimeout(function(){ callback(null, 1); }, 200); }, two: function(callback){ setTimeout(function(){ callback(null, 2); }, 100); } }, function(err, results) { // results is now equal to: {one: 1, two: 2} }); 

Vous pouvez enchaîner des fonctions asynchrones avec la fonction waterfall du module asynchrone. Cela vous permet de dire “faites d’abord x, puis passez les résultats à la fonction y et transmettez les résultats à z.” Copié à partir des [docs] [1]:

 async.waterfall([ function(callback){ callback(null, 'one', 'two'); }, function(arg1, arg2, callback){ // arg1 now equals 'one' and arg2 now equals 'two' callback(null, 'three'); }, function(arg1, callback){ // arg1 now equals 'three' callback(null, 'done'); } ], function (err, result) { // result now equals 'done' }); 

Vous n’avez pas ssortingctement besoin du module asynchrone pour accomplir cela; cette fonction est conçue pour rendre le code plus facile pour les yeux. Si vous ne souhaitez pas utiliser le module asynchrone, vous pouvez toujours utiliser les rappels traditionnels.

Une autre option consiste à utiliser async.auto . Avec async auto, vous pouvez spécifier les données de dépendance pour une tâche et async commencera à l’exécuter dès que possible. Il y a un bon exemple dans le fichier README.md, mais voici en gros votre série ci-dessus:

 async.auto({ one: function(callback){ setTimeout(function(){ callback(null, 1); }, 200); }, // If two does not depend on one, then you can remove the 'one' ssortingng // from the array and they will run asynchronously (good for "parallel" IO tasks) two: ['one', function(callback, results){ setTimeout(function(){ callback(null, 2); }, 100); }], // Final depends on both 'one' and 'two' being completed and their results final: ['one', 'two',function(err, results) { // results is now equal to: {one: 1, two: 2} }]; }); 

J’ai passé pas mal de temps à résoudre ce problème car j’ai rencontré une situation similaire. J’ai essayé les deux async.series et async.waterfall .

async.series : utilise une variable pour partager les fonctions de rappel. Je ne suis pas sûr que ce soit la meilleure façon de le faire. Je dois rendre hommage à Sebastian pour son merveilleux article sur l’ async .

 var async1 = require('async'); exports.asyncSeries1 = function (req, res, callback) { var sharedData = "Data from : "; async1.series([ // First function function(callback) { sharedData = "First Callback"; callback(); }, // Second function function(callback){ console.log(sharedData); sharedData = "Second Callback"; callback(); } ], // Final callback function(err) { console.log(sharedData); if (err) { callback(); } callback(); } ); }; 

async.waterfall : J’ai essayé d’utiliser une autre fonction de rappel en utilisant async.apply . Voici le morceau de code qui m’a aidé à résoudre le problème. `

 var async2 = require('async') exports.asyncWaterfall1 = function (arg1, arg2, cb) { async2.waterfall([ // async.apply async2.apply(assignVariables, arg1, arg2), // First callback function(arg1, arg2, callback){ console.log(arg1); console.log(arg2); arg1 = 5; arg2 = 6; callback(null, arg1, arg2); }, // Second callback function(arg1, arg2, callback){ // arg1 now equals 'one' and arg2 now equals 'two' console.log(arg1); console.log(arg2); arg1 = 7; arg2 = 8; callback(null, arg1, arg2); } ], function (err, arg1, arg2) { console.log(arg1); console.log(arg2); }); }; // Method to assign variables function assignVariables(arg1, arg2, callback) { console.log(arg1); console.log(arg2); arg1 = 3; arg2 = 4; callback(null, arg1, arg2); }; 

PS : crédit .