107

我看了视频,我知道了一般原则——即使没有人订阅,也会发生热点,“按需”会发生冷。此外,Publish() 将冷转换为热,而 Defer() 将热转换为冷。

但是,我仍然觉得我错过了细节。以下是我想回答的一些问题:

  • 你能给这些术语一个全面的定义吗?
  • 在热的 observable 上调用 Publish 或在寒冷的情况下调用 Defer 是否有意义?
  • 热/冷转换有哪些方面 - 例如,您会丢失消息吗?
  • IObservable 和 IEnumerable 的冷热定义有区别吗?
  • 在进行冷或热编程时应考虑哪些一般原则?
  • 关于热/冷可观察的任何其他提示?
4

4 回答 4

133
于 2019-11-04T11:17:28.503 回答
56

Hot observables 是当你没有订阅 observable 时推送事件的。像鼠标移动,或计时器滴答声或类似的东西。Cold observables 是仅在您订阅时才开始推送的对象,如果您再次订阅,它们会重新开始。

于 2010-03-31T00:09:03.117 回答
38

我希望这有帮助。

你能给这些术语一个全面的定义吗?

请参阅我的博客文章:https ://leecampbell.com/2010/08/19/rx-part-7-hot-and-cold-observables

在热的 observable 上调用 Publish 或在寒冷的情况下调用 Defer 是否有意义?

不,不是我能想到的。

热/冷转换有哪些方面 - 例如,您会丢失消息吗?

当 Observable 为 Hot 时,可能会“丢失”消息,因为无论订阅者如何,都会发生“事件”。

IObservable 和 IEnumerable 的冷热定义有区别吗?

我真的不明白这个问题。我希望这个类比有所帮助。我会将 Hot Observable 与 Eagerly 评估的 IEnumerable 进行比较。即一个列表或一个数组都被急切地评估并且已经被填充,即使没有人枚举它们。从文件或数据库中获取值的 yield 语句可以使用 Yield 关键字进行惰性求值。虽然惰性可能很好,但默认情况下,如果第二个枚举器运行它,它会被重新评估。将这些与 Observables 进行比较,Hot Observable 可能是事件(按钮单击)或温度源;无论订阅如何,这些事件都会发生,并且如果对同一个观测值进行了多个订阅,这些事件也会被共享。Observable.Interval 是 Cold observable 的一个很好的例子。它只会在订阅时开始产生值。

在进行冷或热编程时应考虑哪些一般原则?

请参阅第一点中的链接。我还建议您研究与 RefCount 一起使用的 Publsh。这使您能够拥有冷 Observables 的惰性评估语义,但共享 Hot Observables 获得的事件。

关于热/冷可观察的任何其他提示?

弄脏你的手,和他们一起玩。一旦您阅读了超过 30 分钟的内容,那么花在编写代码上的时间对您来说比阅读任何内容都更有效率:)

于 2010-08-19T13:59:12.797 回答
14

不假装给出一个全面的答案,我想以最简单的形式总结从这个问题开始以来我所学到的东西。

Hot observable与事件完全匹配。在事件中,即使没有订阅者在监听,通常也会将值馈送到处理程序中。所有订阅者都收到相同的一组值。由于遵循“事件”模式,热的 observables 比冷的 observables更容易理解

Cold observable也像一个事件,但有一个转折 - Cold observable 的事件不是共享实例的属性,它是每次有人订阅时从工厂生成的对象的属性。此外,订阅开始生成值。由于上述原因,多个订阅者被隔离,每个订阅者都接收自己的一组值。

RX 初学者最常犯的错误是使用函数中的一些状态变量(fe 累计总数)创建冷可观察对象(好吧,认为他们正在创建冷可观察对象),而不是将其包装到 .Defer() 语句中。结果,多个订阅者共享这些变量并在它们之间造成副作用。

于 2011-06-06T17:12:31.037 回答