Maison  >  Article  >  interface Web  >  Quels sont les modèles de conception essentiels pour les nouvelles tentatives de promesse pour gérer les opérations asynchrones ?

Quels sont les modèles de conception essentiels pour les nouvelles tentatives de promesse pour gérer les opérations asynchrones ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-22 17:59:03739parcourir

What Are the Essential Promise Retry Design Patterns for Handling Asynchronous Operations?

Conceptions de réessais de promesses

Les promesses permettent une programmation asynchrone, fournissant un mécanisme flexible et efficace pour gérer les opérations asynchrones. Cependant, il peut être nécessaire de concevoir des modèles pour gérer les scénarios dans lesquels une promesse nécessite de nouvelles tentatives. Nous présentons ici trois modèles de conception de nouvelle tentative de promesse différents :

  1. Réessayer jusqu'à ce que la promesse soit résolue (avec Delay et MaxRetries)
<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>
  1. Réessayer jusqu'à la condition sur le résultat (avec délai et MaxRetries)
<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);
        });
    })</code>
  1. Réessai dynamique efficace en mémoire (avec tentatives illimitées)

Nous explorons une approche alternative basée sur la construction d'une chaîne .catch() au lieu de la chaîne .then() habituelle :

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

Ce modèle convient aux scénarios avec un nombre limité de tentatives et un nombre maximum faible pour éviter les problèmes de consommation de mémoire.

  1. Réessayez jusqu'à ce que le résultat réponde à la condition (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>
  1. Réessayez jusqu'à ce que le résultat réponde aux conditions (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);
    // Don't simplify this to `p.catch(attempt).then(test, rejectDelay)` as test failures won't be caught.
}
p = p.then(processResult).catch(errorHandler);</code>

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