2016-09-13 15 views
1

Observable(HTTPリクエストから)を作成して失敗時に再試行しました。しかし、サーバが429 Too many requestsエラーで応答した場合、を再試行したいと思います。角2 RxJS Observable:429のステータスを除いて再試行

現在の実装では、何があっても1秒間隔で2回リトライします。

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内ステータスコードを取得できますか?

Live demo on Plunker

Angular 2 rc.6RxJS 5 Beta 11Typescript 2.0.2

+0

サーバから受信したためにエラーがスローされた場合、エラーインスタンスには 'status'と' statusText'プロパティが含まれている必要があります。 – cartant

+0

@cartantはい、どうすればこのインスタンスを取得できますか? 'retryWhen'を削除すると、インスタンスは' Response'クラスのオブジェクトとして上記のhandleError()に渡されます。しかし、私は 'retryWhen'ロジック中にそれを読む方法を知らない。私がOPで言及したように、その関数が受け取るもの(上記の 'errors'と呼ばれる)はObservableであり、' status'と 'statusText'プロパティを持つ' Response'というHTTPではありません。 – BeetleJuice

+0

私は、(サーバエラーの結果である)観測可能なエラーのすべてのエラーインスタンスが 'status'と' statusText'プロパティを含むことを期待しています。私は 'retryWhen'演算子に精通していません - したがって、コメント - しかし、エラー自体から'ステータス 'を得ることができるはずです。 – cartant

答えて

9

あなたはretryWhenに渡された観測可能errorsに429のエラーの処理を構成することができます。サーバーから受信したエラーの場合は、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

Cool。私は私のソリューション(私は 'switchMap'を使用して)を共有するために戻ってきましたが、これも同様に動作します。 http://plnkr.co/edit/iz9N8LzYIghwqqrstNEN?p=preview。カートゥントに感謝 – BeetleJuice

+0

これで数時間を失った後、何かが分かるかもしれません。 retryWhenはキャッチする必要があります!それが後になると、呼び出されますが、空のエラーのSubjectがあり、Responseの状態、メッセージなどをチェックすることはできません。 –

関連する問題