Maison > interface Web > js tutoriel > 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
Libérer: 2024-10-22 19:01:21
original
347 Les gens l'ont consulté

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

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

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

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!

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