„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > So implementieren Sie Versprechen, die Entwurfsmuster für die Handhabung der vorübergehenden Fehler implementieren zu können?

So implementieren Sie Versprechen, die Entwurfsmuster für die Handhabung der vorübergehenden Fehler implementieren zu können?

Gepostet am 2025-03-23
Durchsuche:922

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

versprechen retray design musters

Einführung

Wenn asynchrone Operationen fehlschlagen, kann erneut eine wirksame Strategie sein, um vorübergehende Fehler zu behandeln. Dieser Artikel enthält verschiedene Muster für die Wiederholung von vielversprechenden Operationen und konzentriert sich auf drei gemeinsame Szenarien.

Muster Nr. 1: Wiederholung, bis das Versprechen auflöst

Dieses Muster übernimmt kontinuierlich ein Versprechen, bis er erfolgreich auflöst. Es gibt eine Verzögerung zwischen Wiederholungen und einer maximalen Anzahl von Versuchen an.

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

Muster #2: Wiederholen Sie, bis die Bedingung

dieses Muster trifft, bis eine Bedingung auf das Ergebnis des Versprechens erfüllt ist. Es gibt eine Verzögerung zwischen Wiederholungen und maximale Anzahl von Versuchen an.

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

Muster #3: Unbegrenzte Wiederholung mit Bedingung

Dieses Muster bietet eine an ermuteteneffizientes Weg, um unbegrenzte Zeiten wiederzuerlangen. Es gibt nur eine Verzögerung zwischen Wiederholungen an.

alternativen Ansatz unter Verwendung von .catch () ketten

Im Gegensatz zu den obigen Mustern erstellen dieser Ansatz eine .catch () -Kette, nicht eine .then () -Kette. Es begrenzt die Anzahl der Versuche und ist für Szenarien mit niedrigem Maximum geeignet, um übermäßigen Speicherkonsum zu vermeiden.

function rejectDelay(reason) {
    return new Promise(function(resolve, reject) {
        setTimeout(reject.bind(null, reason), t); 
    });
}

return bis beschluss, mit delay

var max = 5;
var p = Promise.reject();

for(var i=0; i 

radry, bis die Bedingung trifft, nein delay

var max = 5;
var p = Promise.reject();

for(var i=0; i 

radry, bis die Bedingung mit Delay

var max = 5;
var p = Promise.reject();

for(var i=0; i 

schlussfolgerung

Diese Muster bieten vielseitige Möglichkeiten zur Implementierung der Wiederholungslogik für asynchrone Operationen. Unabhängig davon, ob .Catch () oder .then () -Ketten verwendet werden, hängt von den Anforderungen ab, z. B. Speicherverbrauch und maximale Anzahl von Versuchen.

Freigabeerklärung Dieser Artikel wird reproduziert unter: 1729587561 Wenn ein Verstoß vorliegt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3