2017-01-30 23 views
3

Angular 2アプリケーションでRxJsを使用して複数のページのAPIからデータを並列に取得し、失敗したリクエストを今後の再試行で保存します。RxJsのフラットマップストリームで処理エラーが発生しました

これを行うには、flatMaping http getリクエスト(以下のコード)で生成されたエラーをキャッチし、さらにストリーム処理を続行します。エラーが発生した場合、私の現在の解決策はストリームを中断させます。

Rx.Observable.range(1, 5) 
    .flatMap(pageNo => { 
       params.set('page', ''+pageNo); 
       return this.http.get(this.API_GET, params) 
         .catch((err) => { 
            //save request 
            return Rx.Observable.throw(new Error('http failed')); 
          }); 
    }) 
    .map((res) => res.json()); 

上記の例では、ページ2と3のHTTPリクエストが失敗するとします。私はこれらの要求の両方に対してエラーを処理したい(後で再試行すると失敗した要求を保存して)他の要求を継続してjson()にマップさせたい。

キャッチの代わりに.onErrorResumeNextを使ってみましたが、私はこの作業を行うことができません。

答えて

5

キャッチ内でObservable.throwを返さないでください。ストリームが必要に応じて続行されます。

外部ストリームに情報を伝播する場合は、たとえばreturn Observable.of("Error: Foo.Bar");を使用できます。

catchにエラーを記録し、Observable.empty()を返して、基本的にエラーを無視してください。言い換えれば

は、単にこれをチェーン:

.catch(error => Rx.Observable.of(error));

const stream$ = Rx.Observable.range(1, 5) 
 
    .flatMap(num => { 
 
     return simulateRest(num) 
 
      .catch(error => { 
 
       console.error(error); 
 
       return Rx.Observable.empty(); 
 
      }); 
 
     }); 
 
       
 
stream$.subscribe(console.log); 
 

 
// mocking-fn for simulating an error 
 
function simulateRest(num) { 
 
    if (num === 2) { 
 
     return Rx.Observable.throw("Error for request: " + num); 
 
    } 
 
    
 
    return Rx.Observable.of("Result: " + num); 
 
}
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

が、私はそれが動作していないようです、ということを試みました。エラーは、失敗した最初の要求に対してのみ記録されます。 –

+0

どのようにエラーを記録していますか?簡単な購読で? – olsn

+0

いいえ、私は上記のコードで '//save request'が書かれたエラーをログに記録しています –