Dalam Soalan Lazim Bluebird Promise, .then(berjaya, gagal) dibenderakan sebagai antipattern. Ini boleh mengelirukan, terutamanya jika anda tidak memahami penjelasan mengenai kenyataan cuba dan tangkap.
Panggilan .then() mengembalikan janji yang menolak jika panggilan balik menimbulkan ralat. Ini bermakna jika pencatat kejayaan gagal, ralat akan dihantar kepada panggilan balik .catch() berikut, bukan panggilan balik gagal yang mengiringi kejayaan.
Aliran kawalan untuk .then dengan dua hujah dan rantaian .then-catch digambarkan di bawah:
[Imej rajah aliran kawalan untuk .then dan .then-catch chain]
Untuk menyatakan ini dalam kod segerak:
// 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); }
Bandingkan ini dengan:
// some_promise_call().then(logger.log).catch(logger.log) try { var results = some_call(); logger.log(results); } catch(e) { logger.log(e); }
Dalam kes ini, pembalak tangkapan mengendalikan pengecualian daripada panggilan pembalak kejayaan.
Hujah terhadap corak ini ialah anda secara amnya harus menangkap ralat dalam setiap langkah pemprosesan dan elakkan menggunakannya dalam rantai. Jangkaan ialah anda hanya mempunyai satu pengendali terakhir untuk semua ralat.
Walau bagaimanapun, corak ini membantu apabila mengendalikan ralat tertentu dalam langkah tertentu dan mengambil tindakan berbeza jika tiada ralat berlaku. Harap maklum bahawa ini mencabangkan aliran kawalan anda.
Pertimbangkan perkara berikut:
some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); });
Sebagai alternatif, anda boleh menggunakan .finally() untuk tujuan ini.
Atas ialah kandungan terperinci Bilakah Menggunakan `.then(berjaya, gagal)` merupakan Antipattern dalam Janji?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!