RxJs热范围可观测

RxJs热范围可观测,rxjs,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:

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

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
1: 1
..
1: 10
2: 1
..
2: 10
但是,我看到它还打印所有值。即使我已经把share()操作符放在后面了。输出如下所示

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

有人能给我解释一下吗?

share
返回一个可观察的,它是订阅计数的引用。当引用计数从0变为1时,共享的可观察对象订阅源-在您的情况下,订阅
范围
可观察对象。当引用计数降至零时,它将从源取消订阅

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

如果将
共享
替换为
发布
,您应该会看到预期的行为:

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

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

太好了!非常感谢。我正在分享一个stackblitz帮助我更好地理解你的答案: