我有一个观察量,它结合了间隔和日期 Select 动作.我用combineLatestswitchMap向这两个观察点提出请求.其思想是,用户正在查看特定日期的表(可以随时更改),并且该表应该每隔20秒更新一次(该时间可由用户配置).

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

这是有效的,除非请求花费的时间超过20秒.如果请求花费很长时间,则每次触发该间隔时,它将取消正在进行的请求并发出新的请求.这是有道理的,因为我使用的是switchMap,如果我改成concatMap,那么这种情况就不会发生.

然而,如果用户更改了日期,则应发出另一个请求并取消前一个请求,这在使用concatMap时不会发生.

我怎样才能同时做到这两点呢?如果用户更改日期,则无论如何都应重新提交请求,但如果在请求进行期间触发间隔,则不应重新提交请求

推荐答案

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

  • switchrefreshInterval$

  • 然后将请求的间隔设置为exhaust|concat

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

Angular相关问答推荐

文件阅读器未正确给出某些CSV文件的结果

Angular Signal只指一种类型,但这里用作值.ts(2693)''

Angular 客户端应用程序无法从停靠容器解析后端服务的地址

如何使用新的@for遍历Angular 为17的对象?

@ngrx/调度时未定义存储操作

Angular :为什么我得到了一个可观察到的共鸣

从Angular 前端访问ASP.NET Core 8 Web API时出现CORS错误

Angular 16模块中未使用的组件是否从Bundle 包中删除(树摇动)?

出错后可观察到的重用

我的验证器收到一个始终为空的可观察值

错误:服务或构建Angular 项目时模块构建失败

Moment.js 和 Angular 库

Angular AuthGuard:不推荐使用 CanActivate 和 CanActivateChild.如何更换它们?

Angular:为什么在 ngAfterContentInit 之后变量未定义?

ng 生成组件不会创建 ngOnInit 和构造函数

如何禁用特定数据集图表js的默认标签

为什么 HttpParams 在 Angular 4.3 中的多行中不起作用

如何 use/import http模块?

如何设置Angular 4背景图片?

Angular [disabled]="MyBoolean" 没有工作