RxJs:可观察状态是有状态的吗?

RxJs:可观察状态是有状态的吗?,rxjs,reactive,Rxjs,Reactive,我问这个问题是因为我尝试了以下代码: //RxJs v5.5.2; NodeJs v7.10.1 var Rx = require('rxjs/Rx'); var observable = Rx.Observable.of(1,2,3); var sub = observable.subscribe(console.log); var sub1 = observable.subscribe(console.log); 它输出1 2 3 1 2 3(新行省略) 然而,正如RxJs的文档所说,

我问这个问题是因为我尝试了以下代码:

//RxJs v5.5.2; NodeJs v7.10.1
var Rx = require('rxjs/Rx'); 
var observable = Rx.Observable.of(1,2,3);

var sub = observable.subscribe(console.log);
var sub1 = observable.subscribe(console.log);
它输出1 2 3 1 2 3(新行省略)

然而,正如RxJs的文档所说,Observable是一个流,那么为什么第二个订阅获得了所有的值呢?我的理解是,在第一次订阅之后,可观察对象已经完成,并且作为一个流,它不应该产生它已经发出的值


我误解了什么吗?

从上面提到的文章中

可观测的只是函数! 可观测项是将观察者与生产者联系起来的函数。就这样。他们不一定要设置监听器,他们只是设置了一个观察者来监听监听器,通常会返回一个拆卸机制来删除该监听器。订阅行为是像函数一样“调用”可观察对象,并将其传递给观察者的行为

因此,可观察对象只是生产者和观察者之间的管道,生产者可以(通常)将状态“烘焙”

试图证明在你的例子中某处有一个生产者
Rx.Observable.of(1,2,3)
,有点困难

可见光的来源是

export const of=ArrayObservable.of;
和可观察的阵列

(…数组:数组)的静态:可观察{ 因此,在这种情况下,扩展操作符是生产者,而
数组
是传递给可观察对象的状态

我找不到spread运算符的源代码,但该ref给出了以下es5等效值

var\u toArray=函数(arr){
返回Array.isArray(arr)?arr:[].slice.call(arr);
};
功能添加(a、b){
返回a+b;
}
var nums=[5,4];
console.log(add.apply(null,_-toArray(nums)));
假设上面的
\u toArray()
是差价的合理近似值,我们可以认为差价本质上是生产者函数

那么,
Rx.Observable.of(1,2,3)
有状态吗?我们可以说是的,因为语句包含状态,但是是等价的

const nums=[1,2,3]
常数src=Rx.可观测的(…nums)
我们可以看到,状态实际上是可观测的外部状态


热的怎么样?

一个热门的可观察对象有一个生产者,它不会按需复制它的值,例如事件

因此,当生产者处于热状态时,可观察到的状态在建立管道之前不会“记住”状态(即当订阅发生时),因此,生产者的状态也不是可观察到的

console.clear()
const eventEmitter=新的eventEmitter();
var source=Rx.Observable.fromEvent(eventEmitter,'数据')
emit('data',1);
emit('data',2);
订阅(x=>console.log('subscription',x))
emit('data',3);
eventEmitter.emit('data',4);


代码按预期工作。请让您自己熟悉冷热流的概念。这里有一个很好的起点:。谢谢您,Richard。我现在知道我误解了什么。我在想热与冷的可观察差异只是关于“何时”,而不是“什么”。也就是说,我认为我的ArrayObservable应该始终生成三个且只有三个项目,而不管观察者是谁。一个观察者可能会错过一些值,因为它订阅一个热门的可观察对象太晚了,但永远不会得到该可观察对象之前已经发布的值。我的错误是,我认为可观察的实际上是制作人