RxJs的热范围可观察到

时间:2018-07-04 13:41:57

标签: rxjs

我正在尝试创建一个可观察到的热范围。这意味着当我有一个观察者在某个超时后观察该可观察对象时,它不应接收已发布的值。我创建了以下程序:

import Rx from "rxjs/Rx";

var x =   Rx.Observable.range(1,10).share()


x.subscribe(x => {
    print('1: ' + x);
  });

setTimeout(() => {
  x.subscribe(x => {
    print('2: ' + x);
  });
}, 1000);

  function print(x) {
    const element = document.createElement('div');
    element.innerText = x;
    document.body.appendChild(element)
  }

我希望此程序先打印1到10,然后再观察第二个程序不打印任何东西,因为值1到10在第一秒内产生。预期的输出如下所示。

1: 1
1: 2
..
1:10

但是,我看到它还会打印所有值。尽管我将share()运算符放在了它后面。输出如下所示。

1: 1
..
1: 10
2: 1
..
2: 10

有人可以向我解释吗?

1 个答案:

答案 0 :(得分:2)

share返回对订阅计数的可观察对象引用。当引用计数从零变为一时,共享的可观察对象将订阅源-在您的情况下,将订阅range可观察对象。并且当参考计数下降到零时,它将取消订阅源。

您的代码段中的关键点是range同步发出其值,然后完成。完成会影响到共享可观察对象的取消订阅,并且看到引用计数回落到零-这将看到共享源可观察对象的取消订阅。

如果将share替换为publish,您应该会看到预期的行为:

var x =   Rx.Observable.range(1,10).publish();
x.subscribe(x => print('1: ' + x));
x.connect();

publish返回一个ConnectableObservable,该计数不被引用计数,并提供一个connect方法,可以调用该方法以显式连接(即订阅)源。