Rxjs Observable Interval和Angular2 HTTP:等待响应

时间:2017-04-09 07:48:43

标签: angular http rxjs observable intervals

我正在尝试创建一个以给定间隔(每5秒)轮询一次日志的服务。我需要进行http GET调用,但是在慢速连接和大型日志上,switchMap会取消之前的待处理请求。因此,当请求被取消时,我永远不会得到日志。

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通话,并且不会取消挂起的通话。

1 个答案:

答案 0 :(得分:3)

使用concatMap()代替switchMap()

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

另一方面,concatMap()运算符等待上一个Observable完成,然后订阅下一个Observable。因此,即使您的计时器发出的速度超过了请求的完成速度,您也将始终以相同的顺序收到所有响应。