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

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

  • 您能为这些术语给出一个全面的定义吗?
  • 在热可观察对象上调用 Publish 或在冷可观察对象上调用 Defer 是否有意义?
  • 热/冷转换有哪些方面 - 例如,您是否会丢失消息?
  • IObservable 和 IEnumerable 的热定义和冷定义之间有区别吗?
  • 在冷或热编程时应考虑哪些一般原则?
  • 关于热/冷可观测值还有其他提示吗?
有帮助吗?

解决方案

我希望这有帮助。

您能为这些术语提供全面的定义吗?

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

在寒冷的热门观察中打电话给发布或在感冒中延迟发表是否有意义?

不,我想不到。

热/冷转化的方面是什么 - 例如,您会丢失消息吗?

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

iObservable和iEnumerable的热和冷定义之间是否存在差异?

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

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

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

关于热/冷观测的其他技巧吗?

把手弄脏并玩一玩。一旦您阅读了超过 30 分钟的内容,那么花时间使用它们进行编码对您来说比阅读更多内容更有效率:)

其他提示

热 observable 是指即使您没有订阅 observable 也会推送的 observable。就像鼠标移动、计时器滴答或类似的东西。冷可观察量是仅在您订阅时才开始推送的可观察量,如果您再次订阅,它们就会重新开始。

我不想假装给出全面的答案,而是想以最简单的形式总结自提出这个问题以来我所学到的知识。

热可观察 与事件完全匹配。在事件中,即使没有订阅者在监听,值通常也会被输入到处理程序中。所有订阅者都收到相同的值集。由于遵循“事件”模式,热可观察量是 更容易理解 比冷的。

冷可观测 也类似于一个事件,但有一个不同之处 - Cold observable 的事件不是共享实例上的属性,它是每次有人订阅时从工厂生成的对象的属性。此外,订阅还开始产生值。由于上述原因,多个订阅者是隔离的,每个订阅者都会收到自己的一组值。

RX 初学者最常犯的错误是使用函数内的一些状态变量(例如累计总数),而不是将其包装到 .Defer() 语句中。结果,多个订阅者共享这些变量并在它们之间造成副作用。

可观察的

从概念上讲,observable 只是一些数据或事件源的包装器,提供一些方便的接口来将源视为实时更新其值的数据流。

冷可观测

在“冷”版本中,源代码不活跃,可以与蓝图、类或原型进行比较。因此,可观察到的东西不会产生任何东西。就像待处理或暂停的流。这使得它成为一个可以安全地传递给纯函数的纯值。一个很好的例子是挂起计数器,在激活时始终从 1 开始。

“订阅”“冷可观察”意味着两件事:创建(或分叉)活动数据流实例并附加订阅者。第一部分类似于从类创建对象。第二部分是实际的订阅,其本身与第一部分无关。

热可观察

“热可观察”已经是一个正在运行的实例。就像从原型创建并准备使用的对象一样。订阅仅涉及实际的观察者附加。不需要激活部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top