Apa bedanya?
The .then()
panggilan akan kembali janji yang akan ditolak dalam kasus panggil balik melempar kesalahan. Ini berarti, ketika kesuksesan Anda logger
gagal, kesalahan akan diteruskan ke .catch()
callback berikut , tetapi tidak ke fail
callback yang menyertainya success
.
Berikut diagram alir kontrol :
Untuk mengekspresikannya dalam kode sinkron:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
Yang kedua log
(yang seperti argumen pertama .then()
) hanya akan dieksekusi jika tidak ada pengecualian yang terjadi. Blok berlabel dan break
pernyataan merasa sedikit aneh, ini sebenarnya apa python memiliki try-except-else
untuk (membaca direkomendasikan!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
The catch
logger juga akan menangani pengecualian dari panggilan sukses logger.
Begitu banyak perbedaannya.
Saya tidak begitu mengerti penjelasannya tentang mencoba dan menangkap
Argumennya adalah bahwa biasanya Anda ingin menangkap kesalahan di setiap langkah pemrosesan, dan Anda tidak boleh menggunakannya dalam rantai. Harapannya adalah bahwa Anda hanya memiliki satu penangan akhir yang menangani semua kesalahan - sementara, ketika Anda menggunakan "antipattern", kesalahan dalam beberapa panggilan balik saat itu tidak ditangani.
Namun, pola ini sebenarnya sangat berguna: Ketika Anda ingin menangani kesalahan yang terjadi pada langkah ini, dan Anda ingin melakukan sesuatu yang sama sekali berbeda ketika tidak ada kesalahan terjadi - yaitu ketika kesalahan tidak dapat dipulihkan. Ketahuilah bahwa ini adalah percabangan aliran kendali Anda. Tentu saja, ini kadang diinginkan.
Apa yang salah dengan yang berikut ini?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Bahwa Anda harus mengulangi panggilan balik Anda. Anda lebih suka
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Anda juga dapat mempertimbangkan .finally()
untuk menggunakan ini.
then().catch()
lebih mudah dibaca, karena Anda tidak perlu mencari koma dan menyelidiki apakah panggilan balik ini untuk cabang sukses atau gagal.