完成后n秒重复请求(Angular2 - http.get)

Spa*_*cus 12 javascript observable rxjs reactivex angular

我玩了angular2并且在一段时间后卡住了.

使用http.get对于单个请求工作正常,但我想每4秒轮询一次实时数据,经过一段时间的修补并阅读了很多反应性的东西后我最终得到:

Observable.timer(0,4000)
  .flatMap(
    () => this._http.get(this._url)
       .share()
       .map(this.extractData)
       .catch(this.handleError)
  )
  .share(); 
Run Code Online (Sandbox Code Playgroud)

在-observable发出请求结果后,是否有一种简单的方法可以启动(4秒)间隔http.get?(或者我最终会在可观察到的地狱?)

我想要的时间表:

Time(s): 0 - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6
Action:  Request - - Response - - - - - - - - - - - - - - - - - - - -Request-... 
Wait:                | wait for 4 seconds -------------------------> |
Run Code Online (Sandbox Code Playgroud)

Can*_*yen 10

更新到RxJS 6

import { timer } from 'rxjs';
import { concatMap, map, expand, catchError } from 'rxjs/operators';

pollData$ = this._http.get(this._url)
  .pipe(
    map(this.extractData),
    catchError(this.handleError)
  );

pollData$.pipe(
  expand(_ => timer(4000).pipe(concatMap(_ => pollData$)))
).subscribe();
Run Code Online (Sandbox Code Playgroud)

我正在使用RxJS 5,我不确定RxJS 4等效运算符是什么.无论如何这里是我的RxJS 5解决方案,希望它有所帮助:

var pollData = this._http.get(this._url)
            .map(this.extractData)
            .catch(this.handleError);
pollData.expand(
  () => Observable.timer(4000).concatMap(() => pollData)
).subscribe();
Run Code Online (Sandbox Code Playgroud)

expand运算符将发出数据并以每次发射递归地启动一个新的Observable

  • 仅供参考:递归不会达到"超出最大调用堆栈大小."错误.使用> 100k网络调用进行测试.仍然很快,并没有吃掉所有内存. (4认同)
  • 一个网络错误和轮询停止.:( (2认同)