一个 Rx Observable 有多少种“温度”?

4

在Rx.Net文献中,普遍提到一个被称为可观察对象的温度

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

另一方面,有热可观察对象(例如Subject<T>),它们将随着新的订阅而加入。

还有温暖可观察对象,例如由RefCount()返回的对象,每次创建订阅时将执行初始化,但仅当没有其他活动订阅时才执行。这些温暖的可观察对象的行为由Dave Sexton在此处解释:

另外,您可以调用Publish然后RefCount以获取在多个连续观察者之间共享的IObservable。请注意,这不是真正的热可观测性 - 它更像是温暖的可观测性。RefCount对基础可观测对象进行单次订阅,只要查询有至少一个观察者。当您的查询没有更多观察者时,将引用计数更改为0,基础订阅将被处理。如果稍后有另一个观察者订阅您的查询,则再次将引用计数从0更改为1,然后RefCount将对基础可观测对象进行新的订阅,从而导致订阅副作用再次发生。

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


也许你错过了我的另一篇博客文章,其中我深入探讨了温度:http://davesexton.com/blog/post/Hot-and-Cold-Observables.aspx - Dave Sexton
1
实际上我已经阅读了它,但是是在发布问题之后。做得好 ;) - marsop
1个回答

6

先回答一个简单的问题:

是否可以通过编程方式获取Observable的温度?

不行。最好的方法是订阅并观察发生的情况。

可观察对象“契约”规定,当您订阅可观察对象时,会收到零个或多个OnNext消息,后跟一个OnCompleted或一个OnError消息(根据情况)。该契约没有规定如何处理多个或更早/更晚的订阅者,这正是可观察的“温度”主要关注的内容。

还有其他需要注意的温度吗?

我甚至不会像您所指定的那样以如此具体或离散的术语来考虑它。

我认为它是以订阅时的效果为基础:最冷的可观察对象在订阅时都会产生影响(例如 Observable.Return(42))。最热的可观察对象在订阅时不会有任何影响(例如new Subject<int>())。在这两极之间是一个连续体。

例如,Observable.Interval(TimeSpan.FromMilliseconds(100))将每隔100毫秒发出一个新数字。与Observable.Return(42)不同,该示例可以通过.Publish().RefCount()大部分“预热”:第一个订阅者启动了数字,但第二个订阅者将只看到最新的数字,而不是从0开始。然而,如果您使用.Replay(2).RefCount()而不是.Publish(),则会有一些在订阅时的影响。PublishReplay可观察对象的“温度”是否相同?

简而言之:不要太关注分类。了解两者之间的区别,并知道一些可观察对象具有较冷的属性,而另一些则具有较暖的属性。


尽管我理解你的意思,但我觉得很难理解为什么这样一个重要的因素被忽略了(热和冷可观察对象之间的区别只有提供可观察对象的人才清楚,对观察者来说完全不透明)。 - marsop
2
我明白你的意思。这可能是关于 observables 最让人困惑的问题了。早期的文档就极力解释了它,因此他们肯定知道可能存在的混淆。但我认为目前还没有任何端口(至少我不知道)对此进行过改进,所以我不确定是否真的有改善的空间。 - Shlomo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接