Rumah >hujung hadapan web >tutorial js >Bilakah Menggunakan `.then(berjaya, gagal)` merupakan Antipattern dalam Janji?

Bilakah Menggunakan `.then(berjaya, gagal)` merupakan Antipattern dalam Janji?

Patricia Arquette
Patricia Arquetteasal
2024-12-28 18:36:13860semak imbas

When is Using `.then(success, fail)` an Antipattern in Promises?

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

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.

Apakah Isunya dengan .then(berjaya, gagal)?

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.

Rajah Aliran Kawalan

Aliran kawalan untuk .then dengan dua hujah dan rantaian .then-catch digambarkan di bawah:

[Imej rajah aliran kawalan untuk .then dan .then-catch chain]

Setara Kod Segerak

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);
}

.then(success) vs. .then( ).catch()

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.

bilakah .kemudian(berjaya, gagal) Antipattern?

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.

Contoh Antipattern yang Diperbaiki

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!

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