startWith()运算符是否将Observable转换为ReplaySubject(1)?

时间:2017-07-25 11:57:17

标签: javascript rxjs

如果我希望订阅者最初获得 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 );

如果没有,是否还有其他更优雅的方式将现有流中的值带入至少有一个初始值/最后值的订阅中?

1 个答案:

答案 0 :(得分:2)

您不需要使用ReplaySubject,但是您应该知道这两个不一样:

  • startWith()运算符只会在订阅时向每个观察者发出预设值。

  • ReplaySubject(1)类会重新发出经过它的最后一项。因此,它向每个观察者发出的第一个值可能不一样,具体取决于你推入这个主题的内容。

注意,还有BehaviorSubject将其初始值作为参数,然后在每次发射时覆盖它,因此它与ReplaySubject(1)非常相似。

然而,有一个重要的区别。当BehaviorSubject收到complete通知时,它永远不会发出任何内容。另一方面,ReplaySubject总是将其缓冲区重播给每个观察者,即使它已经收到complete通知。