我正在尝试在 Angular 应用程序中实现用户权限,但简单来说,情况如下:
加载 MainModule
后,我发出 HTTP 请求并将数据存储在 localStorage
中,这样下次我就可以从那里检索数据。这个逻辑位于 Observable
内,我从多个地方订阅了它。
问题是,如果同时执行两个订阅,在我有机会将数据存储到 localStorage 之前就会发出两个 HTTP 请求。
就是这样,但要进一步解释......
我只想发出一次 HTTP 请求,将数据存储在 localStorage 中并发出值,从第二个订阅者开始,如果可能的话,忽略所有这些逻辑,只返回最后发出的值。
我尝试使用BehaviorSubject
,但是当我重新进入模块时(即user_A注销并且user_B登录),我得到了最后发出的数据。我正在使用的服务在 root
中提供,我无法在 MainModule
中提供它因为我在那里的一些守卫中遇到了 DI 错误。我还读到了share
运算符,但我不太确定如何使用它。
share
的问题是管道可观察量没有完成,所以我打包了 this.http.get<T>
的订阅调用 .next(value)
和.complete()
,在 Observable 内部,现在它可以工作了。我还在发出 HTTP 请求之前添加了 localStorage 的条件。
此外,在每个模块重新输入时,我仍然得到最后发出的值,因此我将函数 getSomeData()
放入属性中以始终获取 Observable 的相同实例。
最佳答案
使用share()运营商在多个订户之间共享源。这将确保响应在许多订阅者之间共享并防止重复的 HTTP 请求。
getSomeData(): Observable<any> {
return this.http.get<any>('/endpoint').pipe(share());
}
您可以在调用 getSomeData()
之前执行 if 条件来检查数据是否已在存储中可用。
关于angular - Rxjs 可观察 : Get HTTP data only for the first subscriber and cached data for the rest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72268212/