我的组件中包含以下代码:
ngOnInit() {
...
this.counterValue$ = interval(1000).pipe(
switchMap(() => this.perfService.getCounter(this.counterUrl)),
map(i => this.updateChart(i)),
);
this.counterValue$.subscribe(v => console.log(v));
}
我写这个来每1秒更新一次图表。问题是perfService.getCounter()花费了1秒以上的时间才能返回。这会导致以下http请求被取消:
该如何解决?
答案 0 :(得分:1)
如果您希望每1秒更新一次,而大多数请求花费的时间超过1秒,那么适合您的运算符可能是exhaustMap
。
简短摘要在这种情况下其他*map
个运算符之间有什么区别:
switchMap
将针对interval(1000)
的每次发射取消待处理的请求。
mergeMap
将针对interval(1000)
的每个发射发出新请求,因此您将同时有许多待处理的请求,然后在它们到达时覆盖它们的响应
concatMap
将堆叠来自interval(1000)
的传入辐射,然后在完成时执行它们,因此,如果您的响应周期很慢,然后很快concatMap
会比1s之后更频繁地发出请求,因为它会先清空内部缓冲区。
exhaustMap
将发出一个请求,然后忽略interval(1000)
的任何后续发射,直到其内部请求完成。不管需要多长时间。然后它将等待来自Observable源的另一次发射。因此,您可以确保至少有1秒的延迟,而不会产生重叠的请求。
答案 1 :(得分:0)
如果即将发布另一个新事件,SwitchMap会取消该事件,您是否尝试过使用tap
运算符?