angular - Rxjs 间隔请求如果仍在进行中则不应重置,但如果用户更改输入则应重置

标签 angular rxjs

我有一个可观察的,它结合了间隔和日期选择操作。我使用 combineLatestswitchMap 向这两个可观察量发出请求。这个想法是用户正在查看特定日期的表(可以随时更改),并且该表应每 20 秒更新一次(此时间可由用户配置)。

data$ = combineLatest(
    this.refreshInterval$,
    this.dateSelected$
).pipe(
    switchMap(([_, date]) => this.requestDataForDate(date))
);

除了请求时间超过 20 秒的情况外,此方法有效。如果请求花费的时间很长,那么每次触发间隔时,它都会取消正在进行的请求并发出新的请求。这是有道理的,因为我使用的是 switchMap,如果我更改为 concatMap 那么这种情况就不会发生。

但是,如果用户更改日期,则应发出另一个请求,并取消前一个请求,而使用 concatMap 时不会发生这种情况。

我怎样才能实现这两个目标?如果用户更改日期,无论如何,请求都应该重新提交,但如果在请求正在进行时触发间隔,则不应重新提交

最佳答案

使用dateSelected$作为基础,您可以:

  • 首先切换refreshInterval$

  • 然后exhaus|concat请求的时间间隔

    data$ = this.dateSelected$.pipe(
      switchMap((date) => 
        this.refreshInterval$.pipe(exhaustMap(() => this.requestDataForDate(date)))
      )
    );
    

关于angular - Rxjs 间隔请求如果仍在进行中则不应重置,但如果用户更改输入则应重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77502972/

相关文章:

javascript - 避免多次按下回车按钮时的多个 http 调用

angular - 类型错误 : Object doesn't support property or method 'map' - AngularJS2

angular - 使用 RxJS 刷新/重新加载 Hot Observable 序列

angular - 使用 *ngFor 自定义模板渲染

angular - typescript 如何在没有引用的情况下复制对象

angular - 如何更改默认的 `Page View` 名称

javascript - chess.js 的 Typescript 声明文件

angular - Angular 4.x 中延迟加载模块出错

Angular 5 RxJS 订阅计时问题

javascript - 从服务器发送请求时发生合并映射错误