Pengenalan
Apabila operasi tak segerak gagal, mencuba semula boleh menjadi strategi yang berkesan untuk menangani ralat sementara . Artikel ini membentangkan pelbagai corak untuk mencuba semula operasi berasaskan Janji, memfokuskan pada tiga senario biasa.
Pola #1: Cuba Semula Sehingga Janji Selesai
Corak ini meneruskan semula janji sehingga ia berjaya diselesaikan. Ia menentukan kelewatan antara percubaan semula dan bilangan maksimum percubaan.
<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>
Pola #2: Cuba Semula Sehingga Keadaan Bertemu
Corak ini mencuba semula sehingga syarat dipenuhi atas hasil janji. Ia menentukan kelewatan antara percubaan semula dan bilangan maksimum percubaan.
<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>
Pola #3: Cuba Semula Tanpa Had dengan Keadaan
Corak ini menyediakan cara yang cekap memori untuk mencuba semula masa tanpa had. Ia hanya menyatakan kelewatan antara percubaan semula.
Pendekatan Alternatif Menggunakan Rantai .catch()
Berbeza dengan corak di atas, pendekatan ini membina rantai .catch(), bukan a .then() rantai. Ia mengehadkan bilangan percubaan dan sesuai untuk senario maksimum rendah untuk mengelakkan penggunaan memori yang berlebihan.
<code class="javascript">function rejectDelay(reason) { return new Promise(function(resolve, reject) { setTimeout(reject.bind(null, reason), t); }); }</code>
Cuba Semula Hingga Selesai, dengan Kelewatan
<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>
Cuba Semula Sehingga Keadaan Bertemu, Tiada Kelewatan
<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>
Cuba Semula Sehingga Keadaan Bertemu, dengan Kelewatan
<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>
Kesimpulan
Corak ini menyediakan cara serba boleh untuk melaksanakan logik cuba semula untuk operasi tak segerak. Sama ada menggunakan rantai .catch() atau .then() bergantung pada keperluan, seperti penggunaan memori dan bilangan maksimum percubaan.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Corak Reka Bentuk Percubaan Semula Janji untuk Pengendalian Ralat Sementara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!