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

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-22 19:01:21249parcourir

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

Modèles de conception de nouvelles tentatives de promesse : une approche efficace en mémoire

Lors de l'utilisation de promesses, réessayer des opérations en cas d'échec ou jusqu'à ce que certaines conditions soient remplies satisfait est un besoin commun. Dans cet article, nous explorerons trois modèles de conception de nouvelles tentatives de promesse :

1. Réessayez jusqu'à ce que la promesse soit résolue

Ce modèle continue de réessayer jusqu'à ce que la promesse soit résolue. Il spécifie un nombre maximum de tentatives et un délai entre les 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>

2. Réessayer jusqu'à ce que la condition du résultat soit remplie

Ce modèle réessaye jusqu'à ce qu'une condition spécifiée soit remplie sur le résultat de la promesse. Il comprend également un nombre maximum de tentatives et un délai entre les 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>

3. Nouvelle tentative dynamique efficace en mémoire

Ce modèle utilise une approche récursive, offrant des tentatives illimitées avec un délai configurable.

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

En construisant une chaîne .catch(), ce modèle permet pour des implémentations concises de nouvelles tentatives, en particulier dans des scénarios avec un faible nombre maximum de tentatives ou des tests synchrones.

Chacun de ces modèles fournit une solution flexible et efficace pour réessayer les opérations Promise. En fonction des exigences de votre application, vous pouvez choisir le motif qui correspond le mieux à vos besoins.

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