Welche asynchrone Version verwenden Sie?
v2.5.0
In welcher Umgebung ist das Problem aufgetreten (Knotenversion / Browserversion)
v6.10.3
Was hast du gemacht?
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!`);
});
Was hast du erwartet?
Die Bestätigung innerhalb des letzten aync.auto-Rückrufs schlägt fehl und löst einen Fehler aus, der nicht abgefangen wird, und stoppt den Node.js-Prozess. In meinem Beispiel aus der Praxis testen wir einen Codeblock in Mocha, der den Fehler behandelt und meldet, dass der Test fehlgeschlagen ist, mit Informationen über die Behauptung, die den Fehler verursacht hat.
Was war das tatsächliche Ergebnis?
Try / Catch aus dem vorherigen automatischen Schritt fängt den Fehler ab und ruft den tryCatch-Rückruf ein zweites Mal auf, was zu einem anderen Fehler führt:
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)
}
Ist ein riesiges Anti-Muster, denn wenn etwas später in der Rückrufkette ausgelöst wird (z. B. Ihre Behauptung), wird es im Block try
abgefangen, was zu einem doppelten Rückruf im Block catch
. Der richtige Weg:
let err, result
try {
result = doSomething()
} catch (e) {
err = e
}
callback(err, result)
@ aearly Sinnvoll , danke für den Tipp!
(Auch hallo! 👋)
👋😊
Hilfreichster Kommentar
Ist ein riesiges Anti-Muster, denn wenn etwas später in der Rückrufkette ausgelöst wird (z. B. Ihre Behauptung), wird es im Block
try
abgefangen, was zu einem doppelten Rückruf im Blockcatch
. Der richtige Weg: