如果我希望订阅者最初至少获得X,可以将startWith(X)用于现有的Observable:
streamFromLibrary.startWith( X ).subscribe( myHandler );
//I want myHandler() to not wait until streamFromLibrary produce a value
//but be called instantly with X
还是仍然需要像这样通过中间ReplaySubject(1)进行传送?
let carrier = new Rx.ReplaySubject( 1 );
carrier.next( X );
streamFromLibrary.subscribe( value => carrier.next( value ) );
carrier.subscribe( myHandler );
否则,是否还有其他更优雅的方法可以将现有流中的值带入具有至少一个初始/最后一个值的订阅中?
最佳答案
您不需要使用ReplaySubject
,但是您应该知道这两个不相同:startWith()
运算符仅在每个观察者订阅时向他们发出预设值。ReplaySubject(1)
类重新发出经过它的最后一项。因此,它向每个观察者发出的第一个值可能会有所不同,具体取决于您推送到此Subject中的内容。
注意,还有BehaviorSubject
将其初始值作为参数,然后在每次发射时都将其覆盖,因此它的作用与ReplaySubject(1)
非常相似。
但是,有一个重要的区别。当BehaviorSubject
收到complete
通知时,它永远不会发出任何东西。另一方面,ReplaySubject
始终向每个观察者重放其缓冲区,即使它已经收到complete
通知也是如此。