<p>async.auto e o caso curioso de try ... catch</p>

Criado em 26 jul. 2017  ·  3Comentários  ·  Fonte: caolan/async

Qual versão do assíncrono você está usando?
v2.5.0
Em qual ambiente o problema ocorreu (versão do nó / versão do navegador)
v6.10.3
O que você fez?

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!`);
});

O que você esperava que fosse acontecer?
A declaração dentro do retorno de chamada aync.auto final falha e lança um erro que não é detectado e para o processo Node.js. No meu exemplo real disso, estamos testando um bloco de código dentro do Mocha, que lida com o erro e relata que o teste falhou com informações sobre a declaração que causou a falha.

Qual foi o resultado real?
Try / Catch da etapa automática anterior captura o erro e chama o retorno de chamada tryCatch uma segunda vez, resultando em um erro diferente:

async/dist/async.js:903
        if (fn === null) throw new Error("Callback was already called.");
                         ^
Error: Callback was already called.
question

Comentários muito úteis

try {
  //...
  return callback(null, result)
} catch (e) {
  //..
  return callback(e)
}

É um anti-padrão enorme porque se algo for acionado posteriormente na cadeia de retorno de chamada (por exemplo, sua declaração), será pego no bloco try , causando um retorno de chamada duplo em catch . Maneira correta:

let err, result
try {
  result = doSomething()
} catch (e) {
  err = e
}
callback(err, result)

Todos 3 comentários

try {
  //...
  return callback(null, result)
} catch (e) {
  //..
  return callback(e)
}

É um anti-padrão enorme porque se algo for acionado posteriormente na cadeia de retorno de chamada (por exemplo, sua declaração), será pego no bloco try , causando um retorno de chamada duplo em catch . Maneira correta:

let err, result
try {
  result = doSomething()
} catch (e) {
  err = e
}
callback(err, result)

@aearly Faz sentido, obrigado pela dica!

(Além disso, olá! 👋)

👋😊

Esta página foi útil?
0 / 5 - 0 avaliações