javascript – RxJs 5共享()运算符如何工作?

前端之家收集整理的这篇文章主要介绍了javascript – RxJs 5共享()运算符如何工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
它不是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有效).

猜你在找的JavaScript相关文章