¿Qué versión de async estás usando?
v2.5.0
¿En qué entorno ocurrió el problema (versión de nodo / versión del navegador)?
v6.10.3
¿Qué hiciste?
async.auto({
returnOne: (callback) => callback(null, 1),
tryCatch: ["returnOne", (results, callback) => {
try {
assert(results.returnOne === 1);
return callback(null);
} catch (err) {
console.log(`Caught an error: ${err.message}`);
return callback(err);
}
}],
}, (err, results) => {
assert(results.returnOne !== 1);
console.log(`All Done!`);
});
Qué esperabas que sucediera?
La aserción dentro de la devolución de llamada aync.auto final falla y arroja un error que no se detecta y detiene el proceso Node.js. En mi ejemplo del mundo real de esto, estamos probando un bloque de código dentro de Mocha, que maneja el error e informa que la prueba falló con información sobre la afirmación que causó la falla.
¿Cuál fue el resultado real?
Try / Catch del paso automático anterior detecta el error y llama a la devolución de llamada tryCatch por segunda vez, lo que da como resultado un error diferente:
async/dist/async.js:903
if (fn === null) throw new Error("Callback was already called.");
^
Error: Callback was already called.
try {
//...
return callback(null, result)
} catch (e) {
//..
return callback(e)
}
Es un anti-patrón enorme porque si algo se lanza más tarde en la cadena de devolución de llamada (por ejemplo, su aserción), quedará atrapado en el bloque try
, causando una devolución de llamada doble en catch
. Manera correcta:
let err, result
try {
result = doSomething()
} catch (e) {
err = e
}
callback(err, result)
@aearly Tiene sentido, ¡gracias por la sugerencia!
(¡También, hola! 👋)
👋😊
Comentario más útil
Es un anti-patrón enorme porque si algo se lanza más tarde en la cadena de devolución de llamada (por ejemplo, su aserción), quedará atrapado en el bloque
try
, causando una devolución de llamada doble encatch
. Manera correcta: