我正在尝试创建一个热范围可观察对象。这意味着当我有一个观察者在一定的超时后观察可观察值时,它不应该收到已经发布的值。我创建了以下程序:
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
有人可以向我解释一下吗?
最佳答案
share
返回一个对订阅进行引用计数的可观察对象。当引用计数从零变为一时,共享可观察对象订阅源 - 在您的情况下,订阅 range
可观察对象。当引用计数回落到零时,它就会取消订阅源。
代码片段中的关键点是 range
同步发出其值,然后完成。完成会影响共享可观察量的取消订阅,并且引用计数会回落到零 - 这会看到共享可观察量从其源中取消订阅。
如果将 share
替换为 publish
,您应该会看到预期的行为:
var x = Rx.Observable.range(1,10).publish();
x.subscribe(x => print('1: ' + x));
x.connect();
publish
返回一个 ConnectableObservable
,它不是引用计数的,并提供一个 connect
方法,可以调用该方法来显式连接(即订阅)来源。
关于可观察到的 RxJs 热范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51175131/