<p>async.auto y el curioso caso de try ... catch</p>

Creado en 26 jul. 2017  ·  3Comentarios  ·  Fuente: caolan/async

¿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.
question

Comentario más útil

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)

Todos 3 comentarios

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! 👋)

👋😊

¿Fue útil esta página
0 / 5 - 0 calificaciones