【发布时间】:2021-06-14 08:21:21
【问题描述】:
Angular 或 RxJS 中是否有任何运算符,如果它们在短时间内被调用,可以将多个 http 请求合二为一?
F.e.当我打开我的应用程序时,ngOnInit 期间的所有 20 个组件都在进行相同的 http 调用:
我已经基于 Angular HttpInterceptor (f.e. https://blog.logrocket.com/caching-with-httpinterceptor-in-angular/) 创建了一个缓存,但是因为所有这些调用都是在初始化时执行的,所以缓存的构建速度不够快。
我可以将所有组件放在一个父级中,这将通过输入将数据传递给子级,但我想保留架构,组件可以在其中初始化自身(它们在其他地方被重用)。
我尝试使用 RxJS 共享或共享回放,但我想在 f.e. 之后停止共享。 1秒。我很乐意让这样的运营商为我服务:
getData(): Observable<any> {
return = this.http.get<any>('endpoint')
.pipe(
shareIfCalledWithin( 1000ms ),
);
【问题讨论】:
-
父组件是您的最佳选择。您仍然可以通过添加一个附加条件来使您的组件可重用 - 如果没有来自父级的数据 - 从子级的 ngOnInit 发出服务器请求。
-
为什么不使用 APP_INITIALIZER? angular.io/api/core/APP_INITIALIZER。这使得在启动您的应用程序之前,会调用一个函数。见,例如这个 SO:stackoverflow.com/questions/49707830/… 知道如何实现它
-
@Eliseo 我稍后也会展示这些组件,例如在对话框内,具有不同的 id 输入参数。因此,我无法预加载数据。
-
我的想法是有一个“缓存”,你总是调用一个返回 observables 的服务函数——如果不存在
data,使用点击创建一个 httpClient.get 将值存储在变量 @ 987654329@,如果存在,返回of(data)