Heim  >  Artikel  >  Web-Frontend  >  Wie implementiert man Promise-Retry-Entwurfsmuster für eine effiziente Fehlerbehandlung?

Wie implementiert man Promise-Retry-Entwurfsmuster für eine effiziente Fehlerbehandlung?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-22 19:01:21253Durchsuche

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

Promise Retry Design Patterns: Ein speichereffizienter Ansatz

Bei der Verwendung von Promises werden Vorgänge wiederholt, wenn Fehler auftreten oder bis bestimmte Bedingungen erfüllt sind erfüllt wird, ist ein allgemeines Bedürfnis. In diesem Artikel werden wir drei Promise-Retry-Entwurfsmuster untersuchen:

1. Wiederholen, bis das Versprechen aufgelöst ist

Dieses Muster wiederholt es so lange, bis das Versprechen aufgelöst wird. Es gibt eine maximale Anzahl von Wiederholungen und eine Verzögerung zwischen den 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>

2. Wiederholen, bis die Bedingung für das Ergebnis erfüllt ist

Dieses Muster wird wiederholt, bis eine bestimmte Bedingung für das Ergebnis des Versprechens erfüllt ist. Es beinhaltet auch eine maximale Anzahl von Wiederholungen und eine Verzögerung zwischen Versuchen.

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

3. Speichereffizienter dynamischer Wiederholungsversuch

Dieses Muster verwendet einen rekursiven Ansatz und bietet unbegrenzte Wiederholungsversuche mit einer konfigurierbaren 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>

Durch den Aufbau einer .catch()-Kette ermöglicht dieses Muster für prägnante Wiederholungsimplementierungen, insbesondere in Szenarien mit niedrigen maximalen Wiederholungszahlen oder synchronen Tests.

Jedes dieser Muster bietet eine flexible und effiziente Lösung für die Wiederholung von Promise-Vorgängen. Abhängig von den Anforderungen Ihrer Anwendung können Sie das Muster auswählen, das Ihren Anforderungen am besten entspricht.

Das obige ist der detaillierte Inhalt vonWie implementiert man Promise-Retry-Entwurfsmuster für eine effiziente Fehlerbehandlung?. 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