Maison > interface Web > js tutoriel > le corps du texte

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

Susan Sarandon
Libérer: 2024-10-22 22:57:29
original
478 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!