2017-04-09 19 views
4

一定の間隔(5秒ごと)でログをポーリングするサービスを作成しようとしています。 http GETコールを行う必要がありますが、遅い接続と大きなログでは、switchMapは以前の保留中の要求をキャンセルします。したがって、要求がキャンセルされているのでログを取得することはありません。Rxjs Observable IntervalとAngular2 HTTP:応答待ち

getLog(url:string):Observable<string> { 
    return Observable 
     .timer(0, 5000) 
     .switchMap(() => this.get(url)) 
     .retryWhen(error => error.delay(5000)) 
     .map((res:Response) => res.text()) 
     .catch(e => { 
      console.warn(e.toString()); 
      return Observable.from(""); 
     }); 
} 

this.get(url)単にget(url) {return this.http.get(url)}です。

私はタイマーの機能を維持しようとしていますが、以前のコールが解決されるまで別のhttpコールをトリガーしないようにしています。

+0

[RxJavaのフラットマップとスイッチマップの違いは何ですか?](http://stackoverflow.com/questions/28175702/what-is-the-difference-between-flatmap-and-switchmap-in- rxjava) – jonrsharpe

+0

別の言い方をすると、代わりに 'flatMap'を使います。 – jonrsharpe

+0

@jonrsharpe 'flatMap'は新しいリクエストを作成し続けます。保留中のリクエストが終了するまで、新しいリクエストを作成したくありません。 – bomba6

答えて

3

switchMap()の代わりにconcatMap()を使用してください。

あなたはswitchMap()オペレータが以前のリクエストをキャンセルしたと言いました。 flatMap()(またはmergeMap())演算子はObservableをもう1つ作成し、すぐにそのすべてにサブスクライブします。

一方、concatMap()オペレータは、以前のObservableが完了するまで待ってから、次のObservableにサブスクライブします。だからあなたのタイマーが要求が完了したよりも速く発光している場合でも、あなたは常に同じ順序ですべての応答を受け取ります。

関連する問題