이 패턴은 성공적으로 해결 될 때까지 약속을 지속적으로 복원합니다. 검색과 최대 시도 횟수 사이의 지연을 지정합니다.
promise.retry = function (fn, times, delay) {. 새로운 약속을 반환합니다 (함수 (해결, 거부) { var 오류; var 시도 = function () { if (times == 0) { 거부 (오류); } 또 다른 { fn (). 그런 다음 (결의) .catch (function (e) { 타임스--; 오류 = e; settimeout (function () {ritch ()}, Delay); }); } }; 시도(); }); };
패턴 #2 : 조건이
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();
});
};
work.publish () . 그런데 (함수 (결과) { 새로운 약속을 반환합니다 (함수 (해결, 거부) { var intervalid = setInterval (function () { work.requeststatus (결과). 스위치 (result2.status) { 사례 "진행": 브레이크; // 아무것도하지 않습니다 사례 "성공": ClearInterVal (IntervalId); 해결 (result2); 부서지다; 사례 "실패": ClearInterVal (IntervalId); 거부 (결과 2); 부서지다; } }). catch (function (error) {clearInterval (intervalid); 거절 (오류)}); }, 1000); }); }) . then (function () {console.log ( 'done')}) .catch (console.error);
패턴 #3 : 조건
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);
패턴 #3 :이 패턴은 무제한 시간을 재 시도하는 메모리 효율적인 방법을 제공합니다. .catch () 체인
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);
대체 접근 방식을 사용하여 검색 간의 지연 만 지정합니다. 위의 패턴과 달리이 접근법은 .then () 체인이 아닌 .catch () 체인을 빌드합니다. 과도한 메모리 소비를 피하기 위해 시도 횟수를 제한하고 최대 규모가 낮은 시나리오에 적합합니다.
var max = 5;
var p = Promise.reject();
for(var i=0; i 는 지연 될 때까지 다시 시도합니다.
var p = promise.reject ();
for (var i = 0; i
조건이 충족 될 때까지 재 시도, 지연 없음 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);
var max = 5;
var p = promise.reject ();
for (var i = 0; i
조건이 만나기 전까지는 다시 시도하고, 지연 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);
var max = 5;
var p = promise.reject ();
for (var i = 0; i
결론
이 패턴은 비동기 작업에 대한 레트리 로직을 구현할 수있는 다목적 방법을 제공합니다. .catch () 또는 .then () 체인을 사용하든 메모리 사용 및 최대 시도 수와 같은 요구 사항에 따라 다릅니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3