角间隔管道,内部任务更长

时间:2018-11-05 11:53:26

标签: angular rxjs

我的组件中包含以下代码:

  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请求被取消: enter image description here

该如何解决?

2 个答案:

答案 0 :(得分:1)

如果您希望每1秒更新一次,而大多数请求花费的时间超过1秒,那么适合您的运算符可能是exhaustMap

简短摘要在这种情况下其他*map个运算符之间有什么区别:

  • switchMap将针对interval(1000)的每次发射取消待处理的请求。

  • mergeMap将针对interval(1000)的每个发射发出新请求,因此您将同时有许多待处理的请求,然后在它们到达时覆盖它们的响应

    < / li>
  • concatMap将堆叠来自interval(1000)的传入辐射,然后在完成时执行它们,因此,如果您的响应周期很慢,然后很快concatMap会比1s之后更频繁地发出请求,因为它会先清空内部缓冲区。

  • exhaustMap将发出一个请求,然后忽略interval(1000)的任何后续发射,直到其内部请求完成。不管需要多长时间。然后它将等待来自Observable源的另一次发射。因此,您可以确保至少有1秒的延迟,而不会产生重叠的请求。

答案 1 :(得分:0)

如果即将发布另一个新事件,SwitchMap会取消该事件,您是否尝试过使用tap运算符?