Rumah >hujung hadapan web >tutorial js >Bilakah `kemudian (berjaya, gagal)` merupakan 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().
.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.
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.
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.
Walaupun sintaks .then().catch() menyediakan pengendalian ralat yang lebih baik, .then(berjaya, gagal) antipattern boleh berguna dalam situasi yang anda mahu:
Walau bagaimanapun, adalah penting untuk diingat bahawa corak ini memperkenalkan percabangan ke dalam aliran kawalan, yang mungkin tidak wajar dalam keadaan tertentu.
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!