Heim > Web-Frontend > js-Tutorial > Hauptteil

Wie implementiert man Promise-Retry-Entwurfsmuster für die Behandlung vorübergehender Fehler?

Susan Sarandon
Freigeben: 2024-10-22 22:57:29
Original
479 Leute haben es durchsucht

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

Promise Retry Design Patterns

Einführung

Wenn asynchrone Vorgänge fehlschlagen, kann ein erneuter Versuch eine wirksame Strategie zur Behandlung vorübergehender Fehler sein . In diesem Artikel werden verschiedene Muster zum Wiederholen von Promise-basierten Vorgängen vorgestellt, wobei der Schwerpunkt auf drei häufigen Szenarien liegt.

Muster Nr. 1: Wiederholen, bis das Promise aufgelöst wird

Dieses Muster wiederholt ein Promise kontinuierlich bis es erfolgreich gelöst wird. Es gibt eine Verzögerung zwischen Wiederholungsversuchen und eine maximale Anzahl von Versuchen an.

<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>
Nach dem Login kopieren

Muster #2: Wiederholen, bis die Bedingung erfüllt ist

Dieses Muster wiederholt, bis eine Bedingung erfüllt ist über das Ergebnis des Versprechens. Es gibt eine Verzögerung zwischen Wiederholungsversuchen und eine maximale Anzahl von Versuchen an.

<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>
Nach dem Login kopieren

Muster #3: Unbegrenzte Wiederholung mit Bedingung

Dieses Muster bietet eine speichereffiziente Möglichkeit um es unbegrenzt oft zu wiederholen. Es gibt nur eine Verzögerung zwischen Wiederholungsversuchen an.

Alternativer Ansatz mit .catch()-Ketten

Im Gegensatz zu den oben genannten Mustern erstellt dieser Ansatz keine .catch()-Kette eine .then()-Kette. Es begrenzt die Anzahl der Versuche und eignet sich für Szenarien mit niedrigem Maximalwert, um übermäßigen Speicherverbrauch zu vermeiden.

<code class="javascript">function rejectDelay(reason) {
    return new Promise(function(resolve, reject) {
        setTimeout(reject.bind(null, reason), t); 
    });
}</code>
Nach dem Login kopieren

Wiederholen bis zur Lösung, mit Verzögerung

<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>
Nach dem Login kopieren

Erneut versuchen, bis die Bedingung erfüllt ist, ohne Verzögerung

<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>
Nach dem Login kopieren

Erneut versuchen, bis die Bedingung erfüllt ist, mit Verzögerung

<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>
Nach dem Login kopieren

Fazit

Diese Muster bieten vielseitige Möglichkeiten, Wiederholungslogik für asynchrone Vorgänge zu implementieren. Ob .catch()- oder .then()-Ketten verwendet werden, hängt von den Anforderungen ab, beispielsweise der Speichernutzung und der maximalen Anzahl von Versuchen.

Das obige ist der detaillierte Inhalt vonWie implementiert man Promise-Retry-Entwurfsmuster für die Behandlung vorübergehender Fehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!