RxJS 5,转换可观察到一个BehaviorSubject(?)
问题描述:
我有可观察到的,一旦它具有订户,将做查找一个父和发射一个单一的值,则完成了。RxJS 5,转换可观察到一个BehaviorSubject(?)
我想那转化为可观察到的(或行为主体或任何作品),其执行以下操作:一旦它至少有一个用户,它会从父观察到的(一次)的结果。然后它将这个价值发放给它的所有用户,并且当它们订阅时也将这个单一价值发给所有未来的订户。即使用户数减少到零,它也应该继续这种行为。
看起来这应该很容易。这里是没有工作:
theValue$: Observable<boolean> = parent$
.take(1)
.share()
没有工作,其他的事情:publishReplay()
,publish()
。一些工作更好:
theValue$ = new BehaviorSubject<boolean>(false);
parent$
.take(1)
.subscribe(value => theValue$.next(value));
有这种方法的一个问题,但:parent$
订阅之前theValue$
得到它的第一个用户。
有没有更好的方法来处理这个问题?
答
shareReplay
应该做你想要什么:
import 'rxjs/add/operator/shareReplay';
...
theValue$: Observable<boolean> = parent$.shareReplay(1);
shareReplay
在RxJS版本5.4.0加入。它返回计数观察到的参考,将订阅源 - parent$
- 在所取得的第一个订阅。并且源完成后的订阅将收到重播通知。
shareReplay
- 和refCount
一般 - 在我最近撰写的文章中更详细地解释:RxJS: How to Use refCount。
这似乎是工作!我打算玩一下,以确保没有任何意外。这看起来不错 - 我只希望他们在创建文档时将其添加到文档中。我不喜欢感觉我正在使用可能消失的无证功能。但是我认为它是在更新日志中添加的,所以我猜它是在这里停留。 – Karptonite
它留在那里。文档是一项正在进行中的工作。无论如何,它非常接近'publishReplay(1).refCount()' - 差别很小。 – cartant
读你的很透彻的博客文章之后,我认为,我可能真的想在这里是'publishLast()。refCount',尽管在实践中,他们可能会在功能上我的情况几乎相同。再次感谢! – Karptonite