Async – le rappel n’est pas une fonction

J’essaie de travailler avec async dans le noeud js, pour contrôler le stream d’exécution de certaines fonctions. Dans le code ci-dessous, j’ai trois fonctions déclarées qui doivent imprimer respectivement “un”, “deux” et “trois”, ainsi que l’exécution d’autres tâches (l’impression ne sert qu’à voir ce qui est exécuté quand).

async.waterfall([ function(callback) { settings(); console.log("1"); callback(null, 'one'); }, function(callback) { profile(); console.log("2"); callback(null, 'two'); }, function(callback) { console.log("3"); groups(); callback(null, 'two'); } ]); 

Donc, j’obtiens l’erreur “le rappel n’est pas une fonction” dans la ligne de rappel (null, ‘deux’); Pour être honnête, cela pourrait aussi bien être une question très fictive, et je ne comprends pas tout à fait comment fonctionne une cascade asynchrone. Mais j’ai sérieusement essayé, en lisant des exemples, en essayant de mettre en œuvre un code court et en jouant avec lui.

Il est intéressant de noter que si async.series est utilisé à la place de async.waterfall, aucune erreur de ce type ne se produit. Toutefois, async.series imprimera 1, 2, 3, trois, un, deux. Les numéros à l’intérieur du modèle en cascade sont imprimés dans l’ordre, mais les fonctions à l’intérieur ne sont pas exécutées dans le bon ordre.

Il est à noter que les deux premières fonctions – parameters et profil – incluent la lecture de la firebase database et les calculs, tandis que la troisième n’imprime que certains résultats.

Avec async.waterfall , les résultats sont transmis à la fonction suivante sous forme d’arguments. Par exemple:

 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' }); 

Dans votre cas, le callback sur la deuxième fonction aura reçu la chaîne one en argument. Et donc l’erreur que vous rencontrez.

Pour simplifier, callback(null, 'one') signifie que vous passez un argument à next. Cela signifie que votre fonction doit accepter 1 paramètre avant le rappel.

callback(null, 'one') suit par function(arg1, callback)arg1 = 'one'

callback(null, 'one', 'two') suit par une function(arg1, arg2, callback)arg1='one' et arg2='two'

 async.waterfall([ function(callback) { settings(); console.log("1"); callback(null, 'one'); }, function(arg1, callback) { profile(); console.log("2"); callback(null, 'two'); }, function(arg1, callback) { console.log("3"); groups(); callback(null, 'two'); } ]); 

Cascade

Tout d’abord, je vous conseille d’utiliser Async auto à la place du modèle en cascade. C’est parce que dans le modèle en cascade, nous allons procéder un par un, comme d’abord nous allons terminer l’exécution de la 1ère fonction, puis passer à la deuxième puis à la 3e, c’est-à-dire aller dans une série peu importe météo notre fonction sont dépendants les uns des autres ou non

Auto

Les avantages de l’auto sont qu’il n’a pas vraiment d’importance si vos fonctions dépendent les unes des autres, car il peut exécuter des tâches en série (pour les fonctions dépendantes) et en parallèle (pour les fonctions indépendantes les unes des autres).

 async.auto({ get_data: function(callback) { console.log('in get_data'); callback(null); }, make_folder: function(callback) { callback(null); }, write_file: ['get_data', 'make_folder', function(results, callback) { callback(null); }], email_link: ['write_file', function(results, callback) { callback(null); }] }, function(err, results) { }); 

Ici, dans l’exemple ci-dessus, nous avons la fonction get_Data et la fonction make_folder qui ne dépendent pas l’une de l’autre. Nous pouvons donc les exécuter en parallèle. En passant le nom de get_Data & make_folder, nous pouvons limiter la fonction write_file à l’exécution uniquement après que les deux fonctions ci-dessus ont été exécutées.

pour plus de détails, visitez http://caolan.github.io/async/docs.html#auto

même jeter un oeil sur async.autoInject, il a récemment été ajouté à async au lieu de auto. mais auto continuera pour les versions précieuses d’async

Ce n’est pas la bonne façon d’utiliser waterfall Essayez de passer un autre paramètre dans les fonctions et de mettre le dernier paramètre en tant que rappel.

 async.waterfall([ function(callback) { settings(); console.log("1"); callback(null, 'one'); }, function(previous_value,callback) { profile(); console.log("2"); callback(null, 'two'); }, function(previous_value,callback) { console.log("3"); groups(); callback(null, 'two'); } ], function(err,result){console.log(result)}); 

Vous avez également oublié de passer le dernier rappel après toute l’exécution.