我正在尝试创建一个以给定间隔(每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通话,并且不会取消挂起的通话。
答案 0 :(得分:3)
使用concatMap()
代替switchMap()
。
正如您所说,switchMap()
运算符取消了之前的请求。 flatMap()
(或mergeMap()
)运算符只是创建另一个Observable并立即订阅所有Observable。
另一方面,concatMap()
运算符等待上一个Observable完成,然后订阅下一个Observable。因此,即使您的计时器发出的速度超过了请求的完成速度,您也将始终以相同的顺序收到所有响应。