【问题标题】:Rxjs Observable Interval and Angular2 HTTP: wait for responseRxjs Observable Interval 和 Angular2 HTTP:等待响应
【发布时间】:2017-09-04 09:13:39
【问题描述】:

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

【问题讨论】:

标签: angular http rxjs observable intervals


【解决方案1】:

使用concatMap() 代替switchMap()。

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

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

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多