2016-11-17 46 views
2

我有一个AuthService,它从Firebase获取一个Observable<auth>数据,并将其放入一个公共变量auth$在组件之间共享Auth可观察值而不执行多次

在我的应用程序的某处,我需要多个组件才能访问此auth$值来检查其内容。

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

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

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

+0

火力点有一定的内部缓存,所以它不应该是一个问题。您可以在DevTools> Network> WebSockets ...中检查网络流量... – Sasxa

+0

好吧,关于Firebase知道的很好,我会检查一下。但是,http呼叫呢? (没有缓存的东西) – Tom

+0

你可以使用['share()'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-share)运算符'this。 authService.auth $ = Observable.of('whatever').share()',它应该在所有订阅之间共享... – Sasxa

回答

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) 
+1

好的,谢谢!我不知道'shareReplay()'。它似乎已被删除。这是说[这里](http://stackoverflow.com/questions/35246873/sharereplay-in-rxjs-5),它应该被'.publishReplay(1).refCount()'替换。你同意吗? – Tom

+0

在github问题上的长时间讨论似乎表明'.publishReplay(1)'的行为在rxjs5中与rxjs4中的行为相同,因此与'refCount()'结合使用似乎可行。虽然没有自己测试过。 –