它不是100%清楚我如何RxJs 5共享()运算符工作,看到这里
latest docs.Jsbin的问题
here.
如果我创建一系列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()运算符添加到source observable中:
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()运算符如何工作?每个订阅是否创建了一个新的可观察链?
解决方法
当您的文档链接似乎是RxJS v4时,请注意您使用的是RxJS v5.我不记得细节,但我认为股东经营者经历了一些变化,特别是在完成和重新订阅的时候,但是不要这样做.
回到你的问题,正如您在学习中所显示的那样,您的期望与图书馆设计不符.观察器懒惰地实例化其数据流,具体地在用户订阅时启动数据流.当第二个用户订阅相同的可观察者时,另一个新的数据流就像是第一个用户一样开始(所以是的,每个订阅创建一个新的可观察链,如你所说).这是RxJS术语中引用的一种冷可观察,这是RxJS observable的默认行为.如果你想要一个可观察的数据发送给订阅者,它在数据到达的时刻,这是一个热观测值,一种获得热观察的方法是使用共享运算符.
您可以在这里找到说明的订阅和数据流:Hot and Cold observables : are there ‘hot’ and ‘cold’ operators?(这对于RxJS v4有效,但大多数对v5有效).