Javascript RxJs 5 share()操作符是如何工作的?

Javascript RxJs 5 share()操作符是如何工作的?,javascript,rxjs,rxjs5,Javascript,Rxjs,Rxjs5,RxJs 5share()操作符是如何工作的,我还不是100%清楚,请参见这里的。请回答这个问题 如果我创建一个0到2的系列的可观测值,每个值间隔1秒: var source = Rx.Observable.interval(1000) .take(5) .do(function (x) { console.log('some side effect'); }); 如果我为这个可观察对象创建两个订户: source.subscribe((n) => console.log("su

RxJs 5
share()
操作符是如何工作的,我还不是100%清楚,请参见这里的。请回答这个问题

如果我创建一个0到2的系列的可观测值,每个值间隔1秒:

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));
var source = Rx.Observable.interval(1000)
.take(3)
.do(function (x) {
    console.log('some side effect ...');
})
.share();
我在控制台中看到:

"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.subscribe((n) => console.log("subscriptor 1 = " + n));
source.subscribe((n) => console.log("subscriptor 2 = " + n));
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 v5,而您的文档链接似乎是RxJS v4。我不记得具体细节,但我认为
share
运营商经历了一些变化,特别是在完成和重新订阅时,但请不要相信我的话

回到你的问题,正如你在研究中所显示的,你的期望与图书馆的设计不符。可观察对象懒洋洋地实例化他们的数据流,具体地在订户订阅时启动数据流。当第二个订户订阅同一个可观察对象时,另一个新的数据流将启动,就像它是第一个订户一样(是的,每个订阅都会创建一个新的可观察对象链,如您所说)。这是RxJS术语中创造的冷可观察的,这是RxJS可观察的默认行为。如果您想要一个observable,在数据到达时将其数据发送给其拥有的订阅者,这被称为热observable,获得热observable的一种方法是使用
share
操作符


您可以在这里找到说明订阅和数据流:(这对RxJS v4有效,但大多数对v5有效)。

如果满足以下两个条件,share会使可观察到的“热”:

  • 订阅服务器数>0
  • 而可观察到的还没有完成
  • 场景1:订阅服务器数>0且在新订阅之前未完成可观察

    var shared  = rx.Observable.interval(5000).take(2).share();
    var startTime = Date.now();
    var log = (x) => (value) => { 
        console.log(`onNext for ${x}, Delay: ${Date.now() - startTime} , Value: ${value}`);
    };
    
    var observer1 = shared.subscribe(log('observer1')),
        observer2;
    
    setTimeout(()=>{
        observer2 = shared.subscribe(log('observer2'));
    }, 3000);
    
    // emission for both observer 1 and observer 2, with the samve value at startTime + 5 seconds
    // another emission for both observers at: startTime + 10 seconds
    
    场景2:新订阅之前,订阅服务器数为零。变“冷”

    场景3:当observable在新订阅之前完成时。变“冷”


    对“共享”操作员来说,设置6000超时的场景1和场景2将更直观。