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。因此,即使您的计时器发出的速度快于请求完成的速度,您也将始终以相同的顺序收到所有响应。
我正在尝试创建一个以给定时间间隔(每 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。因此,即使您的计时器发出的速度快于请求完成的速度,您也将始终以相同的顺序收到所有响应。