Heim >Web-Frontend >js-Tutorial >Wie implementiert man Promise-Retry-Entwurfsmuster für die Behandlung vorübergehender Fehler?

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

Susan Sarandon
Susan SarandonOriginal
2024-10-22 22:57:29540Durchsuche

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>

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>

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>

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>

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>

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>

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!

Stellungnahme:
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