Maison  >  Article  >  interface Web  >  Comment implémenter des modèles de conception de nouvelle tentative de promesse pour la gestion des erreurs transitoires ?

Comment implémenter des modèles de conception de nouvelle tentative de promesse pour la gestion des erreurs transitoires ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-22 22:57:29479parcourir

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

Modèles de conception de nouvelle tentative de promesse

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn