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
Lepaskan: 2024-12-28 18:36:13
asal
859 orang telah melayarinya

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);
}
Salin selepas log masuk

.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);
}
Salin selepas log masuk

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);
   });
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan