2016-10-08 8 views
3

Observableを返すAngular 2 HTTPライブラリを使用しています。 特定のエラーステータス/コードに対して再試行を実装したいと思います。角2 RxJS Observable:RetryWhenフィルタがエラーで再試行するステータス

エラーが429ではない場合、Observable.of(error)がエラー時に再試行するようになっていますが、2回の再試行がすべて失敗すると、フローの実行はcatchブロックではなく成功ブロックになります。

すべての再試行で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が発生すると、新しいObservableを返すためにswitchMapを使用します。そうでなければ、リトライロジックの実行を停止するObservable.throw(x)を返します。

そして、呼び出し元のコードは次のようになります(あなたが戻るたびにエラーが呼び出された場所Observable.throw(X)):

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

私はあなたのコードを試しましたが、うまくいきました。どうもありがとうございます。 –

関連する問題