angular - Rxjs 可观察 : Get HTTP data only for the first subscriber and cached data for the rest

标签 angular rxjs observable angular13

我正在尝试在 Angular 应用程序中实现用户权限,但简单来说,情况如下:

加载 MainModule 后,我发出 HTTP 请求并将数据存储在 localStorage 中,这样下次我就可以从那里检索数据。这个逻辑位于 Observable 内,我从多个地方订阅了它。

问题是,如果同时执行两个订阅,在我有机会将数据存储到 localStorage 之前就会发出两个 HTTP 请求。

就是这样,但要进一步解释......

我只想发出一次 HTTP 请求,将数据存储在 localStorage 中并发出值,从第二个订阅者开始,如果可能的话,忽略所有这些逻辑,只返回最后发出的值。

我尝试使用BehaviorSubject ,但是当我重新进入模块时(即user_A注销并且user_B登录),我得到了最后发出的数据。我正在使用的服务在 root 中提供,我无法在 MainModule 中提供它因为我在那里的一些守卫中遇到了 DI 错误。我还读到了share运算符,但我不太确定如何使用它。

更新(添加到 @NuguAnswer ):

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/

相关文章:

node.js - Angular4 存储 NodeJS 数据

javascript - 使用 Redux-Observable 调度延迟的第二个操作,同时保留第一个操作

node.js - 如何监控 RXJS 订阅数量?

listview - JavaFX ListView重复删除错误

android - 为什么 LiveData 值需要包装器?

javascript - NestJS 根据浏览器语言传递静态文件

java - 无法单击/从下拉列表中选择元素

Angular 4 : JSONP injected script did not invoke callback

javascript - 停止 Rxjs 观察者的下一次执行?

android - 改造链接可观察对象