我不是100%清楚RxJs 5 share()
操作符是如何工作的,请看这里的latest docs。问题here的Jsbin。
如果我创建一个包含0到2的序列的可观察值,每个值被一秒隔开:
var source = Rx.Observable.interval(1000)
.take(5)
.do(function (x) {
console.log('some side effect');
});
如果我为这个可观察对象创建两个订阅者:
source.subscribe((n) => console.log("subscriptor 1 = " + n));
source.subscribe((n) => console.log("subscriptor 2 = " + n));
我在控制台中得到了这个:
"some side effect ..."
"subscriptor 1 = 0"
"some side effect ..."
"subscriptor 2 = 0"
"some side effect ..."
"subscriptor 1 = 1"
"some side effect ..."
"subscriptor 2 = 1"
"some side effect ..."
"subscriptor 1 = 2"
"some side effect ..."
"subscriptor 2 = 2"
我以为每个订阅都会订阅相同的可观察对象,但事实似乎并非如此!这就像订阅行为创建了一个完全独立的可观察对象!
但如果将share()
运算符添加到源可观测对象中:
var source = Rx.Observable.interval(1000)
.take(3)
.do(function (x) {
console.log('some side effect ...');
})
.share();
然后我们得到这个:
"some side effect ..."
"subscriptor 1 = 0"
"subscriptor 2 = 0"
"some side effect ..."
"subscriptor 1 = 1"
"subscriptor 2 = 1"
"some side effect ..."
"subscriptor 1 = 2"
"subscriptor 2 = 2"
这就是我在没有share()
的情况下所期望的。
这里发生了什么,share()
操作符是如何工作的?每个订阅都会创建一个新的观察链吗?
发布于 2016-02-02 06:47:54
请注意,您使用的是RxJS v5,而您的文档链接似乎是RxJS v4。我不记得细节了,但我认为share
操作符经历了一些变化,特别是在完成和重新订阅时,但不要相信我的话。
回到您的问题,正如您在研究中所显示的那样,您的期望与库设计并不对应。可观察者懒惰地实例化它们的数据流,具体地在订阅者订阅时启动数据流。当第二个订阅者订阅相同的可观察对象时,会启动另一个新的数据流,就好像它是第一个订阅者一样(因此,是的,每个订阅都会创建一个新的可观察对象链,正如您所说的那样)。这在RxJS术语中被称为冷可观察对象,这是RxJS可观察对象的默认行为。如果你想让一个可观察对象在数据到达时把它的数据发送给它的订阅者,这就是一个热门的可观测对象,获得一个热门可观测对象的一种方法是使用share
运算符。
你可以在这里找到图解的订阅和数据流:Hot and Cold observables : are there 'hot' and 'cold' operators? (这对RxJS v4有效,但它的大部分内容对v5有效)。
https://stackoverflow.com/questions/35141722
复制相似问题