为什么结果不能共享?

时间:2017-01-16 11:09:05

标签: javascript rxjs rxjs5

我有以下代码段:

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}`));

结果我得到了 enter image description here

但我除了共享结果外:

"Stream 1 1"
"Stream 2 1"
"Stream 1 9"
"Stream 2 9"

为什么结果不会被分享?

1 个答案:

答案 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();

查看现场演示:https://jsbin.com/waraqi/2/edit?js,console