2016-10-08 5 views
3

관찰 가능 객체를 반환하는 Angular 2 HTTP 라이브러리를 사용하고 있습니다. 특정 오류 상태/코드에서 다시 시도를 구현하려고합니다.각도 2 RxJS Observable : RetryWhen 필터가 오류시 다시 시도합니다. 상태

오류가 429가 아닌 경우 문제가 발생하면 Observable.of(error)이 재 시도를 위해 오류가 발생하지만 두 번의 재 시도가 모두 실패하면 흐름 실행이 catch 블록 대신 성공 블록으로 이동합니다.

모든 재 시도에서 블록을 잡으려고 흐름을 실행하는 방법은 실패합니까?

return this.http.get(url,options) 
      .retryWhen((errors) => { 
         return errors 
          .mergeMap((error) => (error.status === 429) ? Observable.throw(error) : Observable.of(error)) 
          .take(2); 
        }) 
         .toPromise() 
         .then((res:Response) => console.log('In Success Block')) 
         .catch((res) => this.handleError(res)); 

은 내가 최근에 비슷한 동작을 구현, 내 문제 파티에 늦게

 return this.http 
    .post(url, JSON.stringify(body), requestOptions).retryWhen((errors) => { 
    return errors 
     .mergeMap((error) => (error.status === 404) ? Observable.throw(error) : Observable.of(error)) 
     .take(2); 
    }).map((res:Response) =>{ 
    if (res.status === 200) 
     return res; 
    else 
     return Observable.throw(res); 
    }) 
    .toPromise(); 
+1

http://stackoverflow.com/questions/39480348/angular-2- rxjs-observable-retry-except-on-429-status/39928110 # 39928110 –

답변

7

조금씩 해결하지만 것입니다.

post<T>(serviceUrl: string, data: any): Observable<T> { 
    return Observable.defer(() => { 
     return super.post<T>(serviceUrl, data); 
    }).retryWhen((error) => { 
     return this.refresh(error); 
    }); 
} 

그리고 리프레시 기능 : 여기 내 솔루션입니다

refresh(obs: Observable<any>): Observable<any> { 
    return obs 
     .switchMap((x: any) => { 
      if (x.status === 401) { 
       return Observable.of(x); 
      } 
      return Observable.throw(x); 
     }) 
     .scan((acc, value) => { 
      return acc + 1; 
     }, 0) 
     .takeWhile(acc => acc < 3) 
     .flatMap(() => { 
      console.log('Token refresh retry'); 
      return this.tokenRefreshService.refreshToken(); 
     }); 
} 

유스 케이스는 내가 HTTP 요청을하고 401 응답을받을 때마다, 나는 다음 토큰 새로 고침을하고 싶은 것입니다 새 토큰으로 초기 요청을 재 시도하십시오. 401이 발생하면 switchMap을 사용하여 새로운 Observable을 반환합니다. 그렇지 않으면 다시 시도 논리가 실행되지 않도록 Observable.throw (x)를 반환합니다.

그리고 호출 코드는 다음과 같습니다 (당신이 반환 할 때마다 오류가 호출된다 Observable.throw (X)) :

this.http.post(x).subscribe(response => { 
     ... 
     } 
    }, error => { 
     ... 
     } 
    }); 
+0

코드를 시도했지만 제대로 작동했습니다. 정말 고맙습니다. –