2016-09-13 4 views
1

HTTP 요청에서 Observable을 구성하여 오류가 발생하면 다시 시도합니다. 그러나 이 아닌 경우 서버가 429 Too many requests 오류로 응답하면을 다시 시도하고 싶습니다.각도 2 RxJS Observable : 429 상태를 제외하고 다시 시도하십시오.

현재 구현은 상관없이 1 초 간격으로 두 번 다시 시도합니다.

return this.http.get(url,options) 
    .retryWhen(errors => { 
     return errors.delay(1000).take(2); 
    }) 
    .catch((res)=>this.handleError(res)); 

errors은 관측 가능합니다. 오류를 일으킨 기본 Response 개체를 어떻게 얻을 수 있습니까? 그것으로 나는 서버의 상태 코드에 액세스 만이 아닌 429의 경우 재 시도 할 수 있습니다 :

return this.http.get(url,options) 
    .retryWhen(errors => { 
     if($code == 429) throw errors; 
     else return errors.delay(1000).take(2); 
    }) 
.catch((res)=>this.handleError(res)); 

가 어떻게 retryWhen 내에서 상태 코드를받을 수 있나요? 당신은 그 errors 관찰에 429 오류의 처리를 구성 할 수 Typescript 2.0.2

+0

서버에서받은 오류로 인해 오류가 발생하면 오류 인스턴스에 'status' 및'statusText' 속성이 있어야합니다. – cartant

+0

@cartant 예.하지만이 인스턴스에 대해 어떻게 알 수 있습니까? 'retryWhen'을 제거하면, 인스턴스는'ResponseEnter' 클래스의 객체처럼 위의 handleError()에 전달됩니다. 하지만 'retryWhen' 논리 중에 어떻게 읽는지 모르겠습니다. OP에서 언급했듯이, 그 함수가받는 (위에서'errors'라고 불리는) 것은 Observable이지,'status'와'statusText' 속성을 가진'Response'는 아닙니다. – BeetleJuice

+0

'status'와'statusText' 속성을 포함하도록 (서버 오류의 결과로) 관찰 가능한 오류의 모든 오류 인스턴스를 기대합니다. 저는'retryWhen' 연산자에 익숙하지 않습니다 - 그러므로 주석 -하지만 오류 자체로부터'status'를 얻을 수 있어야합니다. – cartant

답변

9

Angular 2 rc.6

Live demo on Plunker

, RxJS 5 Beta 11retryWhen에 전달합니다. 관찰 할 수있는 errors에서 방출되는 오류는 서버에서받은 오류 인 경우 status 속성을 포함합니다.

는 오류가 발생하는 429 오류가 발생할 때 다시 시도하는 대신하고자하지 않으려면이 같은 것을 할 수있는 다음과 같은 경우

return this.http.get(url,options) 
    .retryWhen((errors) => { 
     return errors 
      .mergeMap((error) => (error.status === 429) ? Observable.throw(error) : Observable.of(error)) 
      .delay(1000) 
      .take(2); 
    }) 
    .catch((res) => this.handleError(res)); 

대신을, 당신은 방출없이 완료 관찰은 HTTP를 원했다 오류 또는 응답 중 하나를 선택하면 단순히 429 개의 오류를 필터링 할 수 있습니다.

+2

차가워요. 나는 내 솔루션 (나는'switchMap'을 사용했다)을 공유하기 위해 돌아 왔지만 이것은 잘 작동한다. http://plnkr.co/edit/iz9N8LzYIghwqqrstNEN?p=preview. Cartant에게 감사하십시오 – BeetleJuice

+0

이것으로 몇 시간을 잃은 후에 뭔가 분명 할지도 모르겠군요. retryWhen은 반드시 잡으십시오! 그것이 끝나면 호출되지만 도착한 빈 오류 제목이 있으며 응답에서 상태, 메시지 등을 확인할 수 없습니다. –

관련 문제