Promise 재시도 설계
Promise는 비동기 프로그래밍을 허용하여 비동기 작업을 처리하기 위한 유연하고 효율적인 메커니즘을 제공합니다. 그러나 약속에 재시도가 필요한 시나리오를 처리하려면 패턴을 설계해야 할 수도 있습니다. 여기서는 세 가지 다른 Promise 재시도 디자인 패턴을 제시합니다.
<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>
일반적인 .then() 체인 대신 .catch() 체인 구축을 기반으로 하는 대체 접근 방식을 탐색합니다.
<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>
이 패턴은 제한된 수의 시나리오에 적합합니다. 재시도 및 낮은 최대 횟수로 메모리 소비 문제를 방지합니다.
<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>
위 내용은 비동기 작업을 처리하기 위한 필수 약속 재시도 디자인 패턴은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!