Rumah >hujung hadapan web >tutorial js >Apakah Corak Reka Bentuk Percubaan Semula Janji Penting untuk Mengendalikan Operasi Asynchronous?
Promise Retry Designs
Janji membenarkan pengaturcaraan tak segerak, menyediakan mekanisme yang fleksibel dan cekap untuk mengendalikan operasi tak segerak. Walau bagaimanapun, ia mungkin perlu untuk mereka bentuk corak untuk mengendalikan senario di mana janji memerlukan percubaan semula. Di sini kami membentangkan tiga corak reka bentuk janji cuba semula yang berbeza:
<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>
Kami meneroka pendekatan alternatif berdasarkan membina rantaian .catch() dan bukannya rantaian .then() biasa:
<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>
Corak ini sesuai untuk senario dengan bilangan terhad cuba semula dan nombor maksimum yang rendah untuk mengelakkan isu penggunaan memori.
<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>
Atas ialah kandungan terperinci Apakah Corak Reka Bentuk Percubaan Semula Janji Penting untuk Mengendalikan Operasi Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!