<p>async.auto &amp; kasus yang aneh dari try ... catch</p>

Dibuat pada 26 Jul 2017  ·  3Komentar  ·  Sumber: caolan/async

Versi asinkron apa yang Anda gunakan?
v2.5.0
Di lingkungan mana masalah terjadi (Versi node / versi browser)
v6.10.3
Apa yang kamu lakukan?

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

Apa yang Anda harapkan terjadi?
Penegasan di dalam callback aync.auto terakhir gagal dan menampilkan kesalahan yang tidak tertangkap dan menghentikan proses Node.js. Dalam contoh dunia nyata saya ini, kami menguji blok kode dalam Mocha, yang menangani kesalahan dan melaporkan bahwa pengujian gagal dengan informasi tentang pernyataan yang menyebabkan kegagalan.

Apa hasil sebenarnya?
Try / Catch dari langkah otomatis sebelumnya menangkap kesalahan dan memanggil callback tryCatch untuk kedua kalinya, menghasilkan kesalahan yang berbeda:

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

Komentar yang paling membantu

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

Merupakan anti-pola yang sangat besar karena jika sesuatu dilempar nanti dalam rantai panggilan balik (misalnya pernyataan Anda), itu akan terperangkap di blok try , menyebabkan panggilan balik ganda di catch . Jalan yang benar:

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

Semua 3 komentar

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

Merupakan anti-pola yang sangat besar karena jika sesuatu dilempar nanti dalam rantai panggilan balik (misalnya pernyataan Anda), itu akan terperangkap di blok try , menyebabkan panggilan balik ganda di catch . Jalan yang benar:

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

@aearly Masuk akal, terima kasih atas tipnya!

(Juga, halo! 👋)

👋😊

Apakah halaman ini membantu?
0 / 5 - 0 peringkat