Rumah >hujung hadapan web >tutorial js >Bilakah `kemudian (berjaya, gagal)` merupakan Antipattern untuk Janji?

Bilakah `kemudian (berjaya, gagal)` merupakan Antipattern untuk Janji?

DDD
DDDasal
2024-12-22 06:07:12594semak imbas

When is `then(success, fail)` an Antipattern for Promises?

Bilakah .then(berjaya, gagal) Dianggap sebagai Antipattern untuk Janji?

Sintaks .then(berjaya, gagal) dalam janji boleh dilihat sebagai antipattern dalam beberapa kes. Mari terokai sebabnya dan bandingkan dengan pendekatan .then().catch().

Control Flow Differences

.then(berjaya, gagal) mengembalikan janji yang menolak jika fungsi panggil balik melemparkan ralat. Oleh itu, jika pencatat kejayaan gagal, ralat akan dihantar kepada pengendali .catch() yang berikutnya, bukan panggilan balik gagal.

Senario Antipattern

Dalam senario berikut, menggunakan .then( kejayaan, gagal) menjadi bermasalah:

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })

Jika fungsi pengelogan kejayaan gagal, ralat tidak akan ditangkap oleh panggilan balik gagal, tetapi oleh pengendali .catch() seterusnya dalam rantai. Ini boleh mengganggu logik pengendalian ralat yang dimaksudkan.

Lebih suka .then().catch()

Sebaliknya, pendekatan yang disyorkan ialah menggunakan .then() dan .catch() secara berasingan:

some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })

Dalam kes ini, pengendali .catch() juga akan menangkap sebarang ralat yang dilemparkan oleh fungsi pengelogan kejayaan. Ini memastikan semua ralat dikendalikan dengan cara yang konsisten.

Niat Pengendalian Pengecualian

Walaupun sintaks .then().catch() menyediakan pengendalian ralat yang lebih baik, .then(berjaya, gagal) antipattern boleh berguna dalam situasi yang anda mahu:

  • Mengendalikan ralat secara khusus dalam langkah yang diberikan.
  • Ambil tindakan berbeza berdasarkan sama ada ralat berlaku atau tidak.

Walau bagaimanapun, adalah penting untuk diingat bahawa corak ini memperkenalkan percabangan ke dalam aliran kawalan, yang mungkin tidak wajar dalam keadaan tertentu.

Pilihan Alternatif

Sebaliknya .then(berjaya, gagal), kaedah .done() atau .finally() boleh digunakan untuk mengendalikan penyiapan atau ralat secara konsisten.

// Handle errors and completion together
some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });

// Handle completion always, regardless of errors
some_promise_call()
   .finally(function() {
       logger.log('Promise completed');
   });

Atas ialah kandungan terperinci Bilakah `kemudian (berjaya, gagal)` merupakan Antipattern untuk Janji?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn