Rxjs 可观察间隔和 Angular2 HTTP:等待响应

Rxjs Observable Interval and Angular2 HTTP: wait for response

我正在尝试创建一个以给定时间间隔(每 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 调用,并且不取消挂起的调用。

使用 concatMap() 而不是 switchMap()

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

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