我有以下代码段:
const source$ = Rx.Observable.from([1,2,3,4])
.filter(x => x % 2)
.map(x => x * x)
.share();
source$.subscribe(x => console.log(`Stream 1 ${x}`));
source$.subscribe(x => console.log(`Stream 2 ${x}`));
但我除了共享结果外:
"Stream 1 1"
"Stream 2 1"
"Stream 1 9"
"Stream 2 9"
为什么结果不会被分享?
答案 0 :(得分:4)
这是因为你正在使用寒冷的Observable(http://reactivex.io/documentation/observable.html)。
当您第一次订阅它需要refCount()
运算符并订阅其源Observable,即Observable.from()
。这一切都是同步发生的,因此它会向订阅者发出所有值,然后发出完整的内容,使refCount()
取消订阅源,因为没有其他观察者。
然后你订阅第二个观察者,这一切都会再次发生。
如果您希望达到预期的结果,只需使用publish()
将源转换为可连接的可观察对象并手动调用connect()
。
const source$ = Rx.Observable.from([1,2,3,4])
.filter(x => x % 2)
.map(x => x * x)
.publish();
source$.subscribe(x => console.log(`Stream 1 ${x}`));
source$.subscribe(x => console.log(`Stream 2 ${x}`));
source$.connect();