¿Qué versión de async estás usando?
2.6.1
¿En qué entorno ocurrió el problema (versión de nodo / versión del navegador)?
8.11.3
¿Qué hiciste?
Suponiendo que fileObj se suministra desde el exterior:
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);
}],
})
Qué esperabas que sucediera?
Una vez que collectData finaliza la ejecución, filterData debe comenzar la ejecución del parámetro pasado dentro de la función collectCB
¿Cuál fue el resultado real?
TypeError: collectCB no es una función.
El mismo código se ejecuta bien con la versión 2.0.1 pero después de actualizar a 2.6.1 ha dejado de funcionar y es crítico para nosotros. También se agradecerá cualquier solución alternativa.
Tratamos las funciones async
manera diferente, no les pasamos una devolución de llamada. En su lugar, simplemente return
un valor (o throw
un error).
Sí, aprendí lo mismo de StackOverflow y, por lo tanto, publicando una referencia a lo mismo aquí, en caso de que alguien se encuentre con esto en el futuro: Using-async-await-inside-async-auto-chain
Esto también se aplica a async.parallel si las funciones son asincrónicas, debe devolver el valor, no llamar a la devolución de llamada. Esto debería agregarse a la documentación y los ejemplos.
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);
});
Me gustaría volver a escribir muchos de los ejemplos en los documentos para usar más async / await, para resaltar lo que puede hacer ahora.
Más que características en este paquete, necesitamos documentos. Será genial ver más ejemplos en el futuro.
Comentario más útil
Tratamos las funciones
async
manera diferente, no les pasamos una devolución de llamada. En su lugar, simplementereturn
un valor (othrow
un error).