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.
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! 👋)
👋😊
Komentar yang paling membantu
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 dicatch
. Jalan yang benar: