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.
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
Commentaire le plus utile
Nous traitons les fonctions
async
différemment -- nous ne leur passons de rappel. Au lieu de cela, simplementreturn
une valeur (outhrow
une erreur).