Rx可观察到的温度有多少?

时间:2018-10-04 14:18:08

标签: rxjs system.reactive

在Rx.Net的所有文献中都引用了通常称为可观测对象的温度的信息。

冷的可观察对象(例如由Observable.Interval()创建的可观察对象和类似的工厂方法),每次创建新的订阅时都会产生副作用。

在频谱的另一面,有热门可观察物(如Subject<T>),它们将在新订阅时加入。

还有热的可观察变量,例如RefCount()返回的变量,每次创建一个订阅时都会执行初始化,但前提是没有其他活动的订阅。这些here由Dave Sexton解释:

  

或者,您可以先调用Publish然后再调用RefCount来获取在多个连续的观察者之间共享的IObservable。请注意,这并不是真正的热观测-更像是热观测。当您的查询中至少有一个观察者时,RefCount可使对基础观察的单个订阅可见。当查询中没有更多的观察者时,将引用计数更改为0,将处理基础预订。如果以后有其他观察者订阅您的查询,将引用计数从0再次移动到1,则RefCount将使对基础​​可观察项的新订阅变为可订阅状态,从而再次发生订阅副作用。

还有其他应注意的温度吗?是否可以通过编程方式获得Observable的温度?

1 个答案:

答案 0 :(得分:5)

第一个简单问题:

  

是否可以通过编程方式获得可观测物体的温度?

不。最好的办法就是订阅,然后看看会发生什么。

可观察的“合同”指定当您订阅可观察的消息时,您会收到零个或多个OnNext消息,还可以选择后面跟随一个OnCompleted或一个OnError消息。合同没有具体规定如何对待多个或之前/之后的订户,而这正是可观察到的“温度”问题。

  

还有其他应该注意的温度吗?

我什至不会以您指定的具体或离散术语来考虑它。

我是根据订阅效应来考虑的:最冷的可观察变量的所有效应都发生在订阅上(例如Observable.Return(42))。最热门的可观察对象对订阅(new Subject<int>())无效。在这两个极点之间是一个连续体。

例如,

Observable.Interval(TimeSpan.FromMilliseconds(100))将每100毫秒发出一个新数字。该示例与Observable.Return(42)不同,可以通过.Publish().RefCount()进行“预热”:第一个用户开始编号,但是第二个用户将看到唯一的最新编号,而不是从0开始。 ,如果您执行的是.Publish()而不是.Replay(2).RefCount(),那么您会有一些按需订阅的效果。 PublishReplay的可观察物是否具有相同的“温度”?

TL; DR:不要过多地关注分类。了解两者之间的区别,并了解一些可观测的属性具有较冷的属性,而另一些具有较温暖的属性。