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.
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á! 👋)
👋😊
Comentários muito úteis
É 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 emcatch
. Maneira correta: