Rxjs Observable Interval 和 Angular2 HTTP:等待响应

bom*_*ba6 4 http intervals observable rxjs angular

我正在尝试创建一个以给定间隔(每 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("");
        });
}
Run Code Online (Sandbox Code Playgroud)

并且this.get(url)是简单的get(url) {return this.http.get(url)}

我正在寻求保留计时器功能,但在前一个调用解决之前不触发另一个 http 调用,并且不取消挂起的调用。

mar*_*tin 5

使用concatMap()代替switchMap()

正如您所说,switchMap()运营商取消了之前的请求。该flatMap()(或mergeMap())经营者只是创建另一个可观测并订阅他们的一切马上。

另一方面,concatMap()操作员等待直到前一个 Observable 完成,然后订阅下一个 Observable。因此,即使您的计时器发出的时间比请求完成的速度快,您也将始终以相同的顺序收到他们的所有响应。