当前位置: 首页 > 知识库问答 >
问题:

组件之间共享一个可观测的/多播一个Angular2中的可观测的

郏景澄
2023-03-14

学习观察和Angular2。我想找出在多个Angular2组件之间共享可观察到的最佳实践。作为可观察的默认值是不是多播。因此,我的应用程序的不同部分的每个订阅将打开一个新的流(再次调用我的API服务器!)。此外,我需要分享价值,并获得可观察到的最新价值。我听到人们使用行为主题。但这真的很令人困惑,我找不到一个好的例子。以下是我如何在我的AuthService中处理这个问题:

    userInfo$: Observable<User>;

    this.userInfo$ = this.authInfo$
    .switchMap(authInfo => this.findUserByuid(authInfo.$uid)) // finding user info base on authInfo turn or not. 
    .publishReplay(1).refCount();

在Angular2组件中,我这样做:

 this.authService.userInfo$.subscribe(user => {
  console.log (user);
  this.user = user;
})

一切正常。但我想知道在这种情况下我可以使用行为主体吗?通过在我的所有组件之间共享userInfo$我做的一切都对吗(所有需要userInfo$的组件都会执行上面的代码来订阅它)?

共有1个答案

能烨华
2023-03-14

Operator.publishReplay(1)只是以下内容的简写:

.multicast(new ReplaySubject(1))

如果要使用BehaviorSubject,可以使用.publishBehavior('default'),这是的缩写。

.multicast(new BehaviorSubject('default'))

因为您已经在使用. refCount()多播,所以您应该没问题,但是很难从我们在这里看到的内容中给出任何建议。

在您的情况下,是否可以或不能使用行为主体,取决于您想做什么BehaviorSubject接受一个默认值作为参数,该值在订阅者订阅时立即发送给订阅者ReplaySubject重复先前发出的源可观察到的一系列项。

 类似资料:
  • 学习角得到服务和组件和可观察性。 我正在尝试在我的演示应用程序中实现暗模式。该控件由一个服务完成,该服务根据浏览器默认值(如果找到)设置暗主题。 它在应用程序组件中初始化,以便以后在应用程序中放置控制开关。 暗模式从布尔值开始工作,因此为true或false。据我所知,使用一个可观察对象是不够的,因为我希望多个订阅者都以两种方式绑定到订阅,每种方式在服务中切换这些可观察对象。到目前为止,我很肯定这

  • 我有一个HTTP请求,希望将结果共享给多个组件。当然,HTTP请求返回一个可观察的。我希望多个组件能够订阅此服务,而不会触发额外的HTTP请求。 我在一个组件中使用实现了这一点,该组件按需发出HTTP请求,并有另一种方法订阅该主题。虽然这是可行的,但似乎有些过分,而且肯定有更好的方法。 主题服务 和一个订户 和第二个订户 从管道链中删除时,会发出多个网络请求。是否有一种更优雅/正确的方式将观察到的

  • 我有一个服务(ServiceA),客户端可以订阅endpoint,订阅后,该服务使用服务器发送的事件连续产生数据。 如果这很重要的话,我将使用ProjectReactor和Java。 这可能很重要,所以我将解释这个endpoint的作用。每隔15秒,它从另一个服务(ServiceB)获取数据,检查15秒前获取的数据是否有更改,如果有,它将使用此数据生成一个新事件,如果没有更改,它将不发送任何内容(

  • 我有一个带有http请求的服务,它返回我的标题的可观察到的内容 servise.ts 在我的组件中,我有一个函数从service get Request设置。看起来是这样的: 问题是,有时我接收到带有空标签的标题,不需要显示它们,所以我需要对其进行过滤,并对此标题发送.delete()请求。我尝试了类似的方法(想法是在之前添加,然后在另一个subscribe内部调用。)差不多吧 但不确定这是不是个

  • 我在我的一个项目中使用angular 4,我正在进行一个http调用来获取数据。当数据从后端返回时,我会缓存数据,这样对于后续的请求,我就不必一次又一次地进行其余的调用。 这工作得很好。但是如果两个调用同时进行,我会看到网络选项卡中有两个请求而不是一个。所以我尝试共享()来满足“一个可观察的,多个订阅者”。 但同样,我看到网络选项卡中有多个请求,而不是一个。要只打一个电话并与所有用户分享结果,必须