在组件之间共享Auth可观察值而不执行多次
我有一个AuthService
,它从Firebase获取一个Observable<auth>
数据,并将其放入一个公共变量auth$
。在组件之间共享Auth可观察值而不执行多次
在我的应用程序的某处,我需要多个组件才能访问此auth$
值来检查其内容。
我目前只是在组件中执行this.authService.auth$.subscribe(auth => this.auth = auth)
。
这是否意味着我执行
fetch data from Firebase
多次?如果是,我应该将auth $定义为Subject/BehaviorSubject,订阅服务并推送数据
.next
?
缺省情况下,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)
好的,谢谢!我不知道'shareReplay()'。它似乎已被删除。这是说[这里](http://*.com/questions/35246873/sharereplay-in-rxjs-5),它应该被'.publishReplay(1).refCount()'替换。你同意吗? – Tom
在github问题上的长时间讨论似乎表明'.publishReplay(1)'的行为在rxjs5中与rxjs4中的行为相同,因此与'refCount()'结合使用似乎可行。虽然没有自己测试过。 –
火力点有一定的内部缓存,所以它不应该是一个问题。您可以在DevTools> Network> WebSockets ...中检查网络流量... – Sasxa
好吧,关于Firebase知道的很好,我会检查一下。但是,http呼叫呢? (没有缓存的东西) – Tom
你可以使用['share()'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-share)运算符'this。 authService.auth $ = Observable.of('whatever').share()',它应该在所有订阅之间共享... – Sasxa