我正在尝试创建一个可观察到的热范围。这意味着当我有一个观察者在某个超时后观察该可观察对象时,它不应接收已发布的值。我创建了以下程序:
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
有人可以向我解释吗?
答案 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
方法,可以调用该方法以显式连接(即订阅)源。