RxJS 5,转换可观察到一个BehaviorSubject(?)

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

+0

这似乎是工作!我打算玩一下,以确保没有任何意外。这看起来不错 - 我只希望他们在创建文档时将其添加到文档中。我不喜欢感觉我正在使用可能消失的无证功能。但是我认为它是在更新日志中添加的,所以我猜它是在这里停留。 – Karptonite

+0

它留在那里。文档是一项正在进行中的工作。无论如何,它非常接近'publishReplay(1).refCount()' - 差别很小。 – cartant

+0

读你的很透彻的博客文章之后,我认为,我可能真的想在这里是'publishLast()。refCount',尽管在实践中,他们可能会在功能上我的情况几乎相同。再次感谢! – Karptonite