Async: L'utilisation d'async / wait dans la chaîne async.auto conduit à TypeError : le rappel n'est pas une fonction

Créé le 24 sept. 2018  ·  5Commentaires  ·  Source: caolan/async

Quelle version d'async utilises-tu ?
2.6.1

Dans quel environnement le problème s'est-il produit (version du nœud/version du navigateur)
8.11.3

Qu'est-ce que tu as fait?
En supposant que fileObj soit fourni de l'extérieur :

async.auto({
  download: (downloadCB) => {
    if (fileObj) {
      fs.writeFile(__dirname + ‘fileNew.txt’, fileObj.content, 'base64', function (err) {
        if (err){
          return downloadCB(err);
        }
        return downloadCB(null , fileObj.generatedFileName); // works fine
      });
    } else {
      let err = new Error('File not found');
      return downloadCB(err);
    }
  },
  collectData: ['download', async (results, collectCB) => {
    console.log(typeof collectCB); // prints undefined
    console.log(typeof results); // prints correct object

    let res = await anHttpRequest();
    if (res.response && res.response.statusCode == 200) {
      return collectCB(null , 'fileCombined.txt'); // This is where the ISSUE happens
    }
    else if(res.response.statusCode >= 300) {
      return collectCB(new Error('Request failed inside async-auto'));
    }
  }],

  filterData: ['collectData', (results, filterCB) => {
    doFilter(results.collectData, filterCB);
  }],
})

Que vous attendiez-vous à ce qu'il se passe?
Une fois l'exécution de collectData terminée, filterData doit commencer l'exécution du paramètre transmis dans la fonction collectCB

Quel a été le résultat réel ?
TypeError : collectCB n'est pas une fonction.

Le même code s'exécute bien avec la version 2.0.1, mais après la mise à niveau vers la version 2.6.1, il a cessé de fonctionner et c'est critique pour nous. Toute solution de contournement sera également appréciée.

docs question

Commentaire le plus utile

Nous traitons les fonctions async différemment -- nous ne leur passons de rappel. Au lieu de cela, simplement return une valeur (ou throw une erreur).

Tous les 5 commentaires

Nous traitons les fonctions async différemment -- nous ne leur passons de rappel. Au lieu de cela, simplement return une valeur (ou throw une erreur).

Oui, j'ai appris la même chose de StackOverflow et j'ai donc posté une référence à la même chose ici, au cas où quelqu'un tomberait dessus à l'avenir : Using-async-await-inside-async-auto-chain

Cela s'applique également à async.parallel si les fonctions sont asynchrones, vous devez renvoyer la valeur sans appeler le rappel. Cela devrait être ajouté à la documentation et aux exemples.

        async.parallel({
            // NOTE: for async functions just return value or throw error
            // don't use the callback
            dates: async function(callback) {
                var rr = await getDates(dbName, r.indi, idx);
                return rr;
             },
             sdates: async function(callback) {
                  var rr = await getDates(dbName, r.spouse, idx);
                  return rr;
             },
             cdates: async function(callback) {
                  var rr = await getDates(dbName, r.cindi, idx);
                  return rr;
             }
        },
        function(err, results) {
             console.log(results);
        });

J'aimerais réécrire de nombreux exemples dans la documentation pour utiliser plus d'async/wait, pour mettre en évidence ce que vous pouvez faire maintenant.

Plus que les fonctionnalités de ce package, nous avons besoin de documents. Ce sera formidable de voir plus d'exemples à l'avenir

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