<p>async.auto &amp; der merkwürdige Fall von try ... catch</p>

Erstellt am 26. Juli 2017  ·  3Kommentare  ·  Quelle: caolan/async

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

Hilfreichster Kommentar

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)

Alle 3 Kommentare

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

👋😊

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen