我试图在Angular应用程序中实现用户权限,但简单地说,这是一个场景:

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

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

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

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

我try 使用BehaviorSubject,但当我重新进入模块时,我得到了最后发出的数据(即user_A次注销,user_B次登录).我使用的服务是在root中提供的,我无法在MainModule中提供,因为我在那里的一些警卫中遇到DI错误.我也读过share操作符,但我不确定如何使用它.

UPDATE(添加到@NuguAnswer):

share的问题是管道化的observable没有完成,所以我打包了this.http.get<T>的订阅,在observable中调用.next(value).complete(),现在它开始工作了.在发出HTTP请求之前,我还添加了localStorage的条件.

此外,在每个模块重新输入时,我仍然得到最后发出的值,因此我将函数getSomeData()转换为一个属性,以始终获得可观察对象的相同实例.

推荐答案

使用share()运算符在多个订阅者之间共享源.这将确保响应在多个订阅者之间共享,并防止重复的HTTP请求.

getSomeData(): Observable<any> {
  return this.http.get<any>('/endpoint').pipe(share());
}

您可以在调用getSomeData()之前执行if条件,以判断数据是否已在存储中可用.

Angular相关问答推荐

Angular 信号不更新afterNextender()

tabindex on button on button in MatMenu in angular不工作

如果Angular 模块是独立的,为什么我不需要在App模块中使用RouterModule?

将sass与@Use语句一起使用时出现Angular 新的VITE构建器编译错误

FromEvent不工作,本机事件绑定

当信号的值发生变化时,模板不会更新

使用forkJoin和mergeMap的正确方式是什么?

URL 更改但组件未在 Angular 导航中呈现

路由链接不在 Ionic 中执行

将 injectiontoken 用于 Angular 中的模块特定设置

如何以像素为单位将属性绑定到 style.width?

CORS 错误:requests are only supported for protocol schemes: http…等

如何以Angular 获取嵌套表单组的控件

NG 测试中的调试测试

在Angular2中获取服务的域名

交替行 colored颜色 angular material表

Angular 2 router.navigate

Angular 2表单验证重复密码

Angular2 - 从外部验证和提交表单

如何从materialAngular使用分页器?