2017-06-20 15 views
1

Angular4で要求/応答傍受メカニズムを実装しようとしています。私はObservableにかなり新しいです。Http Angular 4のリトライメカニズムをリクエストしますか?

私は、リクエスト用とレスポンス用の2つのインターセプタ配列を維持しています。インターセプタは、リクエスト/レスポンスオブジェクトを受け取り、それらを変換する関数に過ぎません。

sendRequest(req:Response):Observable<Response>{ 
    req= this.processRequest(req); 

    This.http.request(req) 
      .map((res:Response)=>{ 
       return this.processResponse(res) 
      }) 
      .catch(this.handleError) 
} 

handleError(err:Response):Observable<Response>{ 
    return Observable.throw(err); 
} 

基本的なエラー処理が正常に機能します。時々401の例外のために、私は新しい認証トークンを取得し、更新された認証トークンで同じ要求を再試行したいと思います。

私が考えているのは、エラーインターセプタの配列を導入することです。エラーインターセプタ関数の1つが401であるかどうかをチェックし、サーバーに新しいリフレッシュ要求を発行し、後続のエラーインターセプタ関数を無効にします。私は、観測可能なストリームを切り替える必要があると仮定します。オブザーバーは最終的には最新のリクエストから応答を得るでしょう。これを進めるには?

this.http.get('some/url').retry(2)......

+0

これを試してください:https://stackoverflow.com/questions/36652495/angular2-http-retry-logic – SrAxi

+0

[Angular2 http retry logic]の重複している可能性があります(https://stackoverflow.com/questions/36652495/angular2- http-retry-logic) – Pace

+0

@Pace疑わしいのは、インターセプタ関数内からストリームを切り替えることです。私がhttp.requestと同じレベルにある場合、Switchmapは動作します。 – NewtonCode

答えて

2

これを試してみてください問題がない場合...

あなたのインターセプタは要求オブジェクト自体で動作しており、要求オブジェクトのコピーを返すと思いますか?

interface Interceptor<T> { 
    (rsp: T): V; 
} 

あなたは

interface Interceptor<T> { 
    (rsp: T): T | Promise<T> | Observable<T>; 
} 

次にあなたができるようなものにインターセプタのプロトタイプを変更することができます:。インターセプターは、次のプロトタイプを持っている。例えば、何かのような...

transformResponse(response) { 
    for(let interceptor of interceptors) { 
    response = interceptor(response); 
    } 
    return response; 
} 

..

transformResponse(responseObs: Observable<any>) { 
    for(let interceptor of interceptors) { 
    responseObs = responseObs.flatMap(interceptor); 
    } 
    return responseObs; 
} 

これは、インターセプタが応答の非同期変換(リクエストの再発行など)を返すことを可能にします。

+2

少し説明する役に立った.. – Blackbam

0

そうでなければ、要求を再発行するすべての情報を追跡する必要がありますので、http.requestと同じレベルにそれを行うには私には簡単に思えるが、多分それは次のようになります。

関連する問題