如果我希望订阅者最初获得 X ,我可以对现有的Observable使用 startWith(X):
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 );
如果没有,是否还有其他更优雅的方式将现有流中的值带入至少有一个初始值/最后值的订阅中?
答案 0 :(得分:2)
您不需要使用ReplaySubject
,但是您应该知道这两个不一样:
startWith()
运算符只会在订阅时向每个观察者发出预设值。
ReplaySubject(1)
类会重新发出经过它的最后一项。因此,它向每个观察者发出的第一个值可能不一样,具体取决于你推入这个主题的内容。
注意,还有BehaviorSubject
将其初始值作为参数,然后在每次发射时覆盖它,因此它与ReplaySubject(1)
非常相似。
然而,有一个重要的区别。当BehaviorSubject
收到complete
通知时,它永远不会发出任何内容。另一方面,ReplaySubject
总是将其缓冲区重播给每个观察者,即使它已经收到complete
通知。