2017-04-09 133 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中的flatmap和switchmap有什么不同?](http://stackoverflow.com/questions/28175702/what-is-the-difference-between-flatmap-and-switchmap-in- rxjava) – jonrsharpe

+0

换句话说:改用'flatMap'。 – jonrsharpe

+0

@jonrsharpe'flatMap'不断创建新的请求。我不想在挂起的请求完成之前创建新的请求。 – bomba6

回答

3

使用concatMap()而不是switchMap()

如您所说,switchMap()运算符会取消先前的请求。 flatMap()(或mergeMap())运算符只是创建另一个Observable并立即订阅它们。

另一方面,concatMap()运算符等待,直到前一个Observable完成,然后订阅下一个Observable。因此,即使您的计时器发出的请求完成得比您的计时器快,您仍然会以相同的顺序收到所有回复。