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!