Maison >interface Web >js tutoriel >Comment implémenter des modèles de conception de nouvelle tentative de promesse pour la gestion des erreurs transitoires ?
Introduction
Lorsque les opérations asynchrones échouent, réessayer peut être une stratégie efficace pour gérer les erreurs passagères . Cet article présente différents modèles permettant de réessayer des opérations basées sur la promesse, en se concentrant sur trois scénarios courants.
Modèle n° 1 : réessayer jusqu'à ce que la promesse soit résolue
Ce modèle réessaie continuellement une promesse. jusqu'à ce qu'il soit résolu avec succès. Il spécifie un délai entre les tentatives et un nombre maximum de tentatives.
<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>
Modèle n°2 : Réessayer jusqu'à ce que la condition soit remplie
Ce modèle réessaye jusqu'à ce qu'une condition soit remplie. sur le résultat de la promesse. Il spécifie un délai entre les tentatives et un nombre maximum de tentatives.
<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>
Modèle n° 3 : Nouvelles tentatives illimitées avec condition
Ce modèle fournit un moyen efficace en termes de mémoire. pour réessayer un nombre illimité de fois. Il spécifie uniquement un délai entre les tentatives.
Approche alternative utilisant des chaînes .catch()
Contrairement aux modèles ci-dessus, cette approche construit une chaîne .catch(), et non une chaîne .then(). Il limite le nombre de tentatives et convient aux scénarios à faible maximum pour éviter une consommation excessive de mémoire.
<code class="javascript">function rejectDelay(reason) { return new Promise(function(resolve, reject) { setTimeout(reject.bind(null, reason), t); }); }</code>
Réessayez jusqu'à la résolution, avec délai
<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>
Réessayez jusqu'à ce que la condition soit remplie, sans délai
<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>
Réessayez jusqu'à ce que la condition soit remplie, avec délai
<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>
Conclusion
Ces modèles offrent des moyens polyvalents d'implémenter une logique de nouvelle tentative pour les opérations asynchrones. L'utilisation des chaînes .catch() ou .then() dépend des exigences, telles que l'utilisation de la mémoire et le nombre maximum de tentatives.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!