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有效).

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...