Bagaimana untuk Melaksanakan Corak Reka Bentuk Percubaan Semula Janji untuk Pengendalian Ralat Sementara?

Susan Sarandon
Lepaskan: 2024-10-22 22:57:29
asal
479 orang telah melayarinya

How to Implement Promise Retry Design Patterns for Transient Error Handling?

Corak Reka Bentuk Janji Cuba Semula

Pengenalan

Apabila operasi tak segerak gagal, mencuba semula boleh menjadi strategi yang berkesan untuk menangani ralat sementara . Artikel ini membentangkan pelbagai corak untuk mencuba semula operasi berasaskan Janji, memfokuskan pada tiga senario biasa.

Pola #1: Cuba Semula Sehingga Janji Selesai

Corak ini meneruskan semula janji sehingga ia berjaya diselesaikan. Ia menentukan kelewatan antara percubaan semula dan bilangan maksimum percubaan.

<code class="javascript">Promise.retry = function(fn, times, delay) {
    return new Promise(function(resolve, reject){
        var error;
        var attempt = function() {
            if (times == 0) {
                reject(error);
            } else {
                fn().then(resolve)
                    .catch(function(e){
                        times--;
                        error = e;
                        setTimeout(function(){attempt()}, delay);
                    });
            }
        };
        attempt();
    });
};</code>
Salin selepas log masuk

Pola #2: Cuba Semula Sehingga Keadaan Bertemu

Corak ini mencuba semula sehingga syarat dipenuhi atas hasil janji. Ia menentukan kelewatan antara percubaan semula dan bilangan maksimum percubaan.

<code class="javascript">work.publish()
    .then(function(result){
        return new Promise(function(resolve, reject){
            var intervalId = setInterval(function(){
                work.requestStatus(result).then(function(result2){
                    switch(result2.status) {
                        case "progress": break; //do nothing
                        case "success": clearInterval(intervalId); resolve(result2); break;
                        case "failure": clearInterval(intervalId); reject(result2); break;
                    }
                }).catch(function(error){clearInterval(intervalId); reject(error)});
            }, 1000);
        });
    })
    .then(function(){console.log('done')})
    .catch(console.error);</code>
Salin selepas log masuk

Pola #3: Cuba Semula Tanpa Had dengan Keadaan

Corak ini menyediakan cara yang cekap memori untuk mencuba semula masa tanpa had. Ia hanya menyatakan kelewatan antara percubaan semula.

Pendekatan Alternatif Menggunakan Rantai .catch()

Berbeza dengan corak di atas, pendekatan ini membina rantai .catch(), bukan a .then() rantai. Ia mengehadkan bilangan percubaan dan sesuai untuk senario maksimum rendah untuk mengelakkan penggunaan memori yang berlebihan.

<code class="javascript">function rejectDelay(reason) {
    return new Promise(function(resolve, reject) {
        setTimeout(reject.bind(null, reason), t); 
    });
}</code>
Salin selepas log masuk

Cuba Semula Hingga Selesai, dengan Kelewatan

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).catch(rejectDelay);
}

p = p.then(processResult).catch(errorHandler);</code>
Salin selepas log masuk

Cuba Semula Sehingga Keadaan Bertemu, Tiada Kelewatan

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).then(test);
}

p = p.then(processResult).catch(errorHandler);</code>
Salin selepas log masuk

Cuba Semula Sehingga Keadaan Bertemu, dengan Kelewatan

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).then(test).catch(rejectDelay);
}

p = p.then(processResult).catch(errorHandler);</code>
Salin selepas log masuk

Kesimpulan

Corak ini menyediakan cara serba boleh untuk melaksanakan logik cuba semula untuk operasi tak segerak. Sama ada menggunakan rantai .catch() atau .then() bergantung pada keperluan, seperti penggunaan memori dan bilangan maksimum percubaan.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Corak Reka Bentuk Percubaan Semula Janji untuk Pengendalian Ralat Sementara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!