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 :
<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>
<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>
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.
<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>
<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!