Qual versão do assíncrono você está usando?
2.6.1
Em qual ambiente o problema ocorreu (versão do nó / versão do navegador)
8.11.3
O que você fez?
Supondo que fileObj seja fornecido de fora:
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);
}],
})
O que você esperava que fosse acontecer?
Depois que collectData terminar a execução, filterData deve começar a execução do parâmetro passado na função collectCB
Qual foi o resultado real?
TypeError: collectCB não é uma função.
O mesmo código executa bem com a versão 2.0.1, mas após a atualização para 2.6.1 ele parou de funcionar e é crítico para nós. Qualquer solução alternativa também será apreciada.
Tratamos as funções async
diferente - não passamos a elas um retorno de chamada. Em vez disso, simplesmente return
a valor (ou throw
um erro).
Sim, aprendi sobre o mesmo com StackOverflow e postando uma referência ao mesmo aqui, caso alguém se depare com isso no futuro: Using-async-await-inside-async-auto-chain
Isso também se aplica a async.parallel se as funções forem assíncronas, você precisará retornar o valor e não chamar o retorno de chamada. Isso deve ser adicionado à documentação e aos exemplos.
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);
});
Eu gostaria de reescrever muitos dos exemplos nos documentos para usar mais async / await, para destacar o que você pode fazer agora.
Mais do que recursos neste pacote, precisamos de documentos. Será ótimo ver mais exemplos no futuro
Comentários muito úteis
Tratamos as funções
async
diferente - não passamos a elas um retorno de chamada. Em vez disso, simplesmentereturn
a valor (outhrow
um erro).