在组件之间共享Auth Observable值而不多次执行它

时间:2016-11-17 09:16:03

标签: angular rxjs reactive-programming observable subject

我有AuthService从Firebase获取Observable<auth>数据并将其放入公共变量auth$

在我的应用中,我需要多个组件来访问此auth$值以检查其内容。

我目前只在组件中执行this.authService.auth$.subscribe(auth => this.auth = auth)

  1. 这是否意味着我多次执行fetch data from Firebase

  2. 如果是,我应该将auth $定义为Subject / BehaviorSubject,订阅服务并使用.next推送数据吗?

1 个答案:

答案 0 :(得分:3)

默认情况下,observable未启用多播。这意味着多个订阅将生成自己的流。由于您不希望每个订阅重新获取身份验证凭据,因此您需要使原始流与多播兼容。这是使用例如share()运算符完成的,它将在第一次订阅时使流热,并在内部存储所有后续订阅的引用计数。

由于订阅较晚的订阅在流变热时不会自动获取先前发布的值,因此我们需要构建功能来重放发出的值。

这两个要求都组合在shareReplay()运算符中,该运算符允许您多播最新的 n 值。

所以你的代码看起来像这样:

const authStream = this.authService.auth$.shareReplay(1);

// component 1
const myAuthDisposable = authStream.subscribe(auth => this.auth = auth)

// component 2
const myAuthDisposable = authStream.subscribe(auth => this.auth = auth)