"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 일시적 오류 처리를위한 약속의 재 시도 패턴을 구현하는 방법은 무엇입니까?

일시적 오류 처리를위한 약속의 재 시도 패턴을 구현하는 방법은 무엇입니까?

2025-03-23에 게시되었습니다
검색:359

How to Implement Promise Retry Design Patterns for Transient Error Handling?

패턴 #1 : 약속이 해결 될 때까지 다시 시도합니다

이 패턴은 성공적으로 해결 될 때까지 약속을 지속적으로 복원합니다. 검색과 최대 시도 횟수 사이의 지연을 지정합니다.

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

결론

How to Implement Promise Retry Design Patterns for Transient Error Handling?

이 패턴은 비동기 작업에 대한 레트리 로직을 구현할 수있는 다목적 방법을 제공합니다. .catch () 또는 .then () 체인을 사용하든 메모리 사용 및 최대 시도 수와 같은 요구 사항에 따라 다릅니다.

릴리스 선언문 이 기사는 1729587561에 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3