Heim >Web-Frontend >js-Tutorial >Wie implementiert man Promise-Retry-Entwurfsmuster für die Behandlung vorübergehender Fehler?
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!