什么是热和冷可观测量?

Ser*_*hov 44 system.reactive

我观看了视频,我知道了一般原则 - 即使没有人订阅也会发生热情,冷却发生在"按需".此外,Publish()将冷转换为热,Defer()将冷转换为冷.

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

  • 你能否对这些术语给出全面的定义?
  • 在热门的观察中呼叫发布或在寒冷中推迟发布是否有意义?
  • 热/冷转换的哪些方面 - 例如,您是否丢失了消息?
  • IObservable和IEnumerable的热定义和冷定义之间是否存在差异?
  • 在为冷或热编程时应该考虑哪些一般原则?
  • 关于热/冷可观测量的任何其他提示?

H S*_*ogr 94

来自:Anton Moiseev 的书“Angular Development with Typescript,第二版”。

冷热观测

两种类型的可观察对象:热和冷。主要区别在于冷 observable每个订阅者创建一个数据生产者,而热 observable 首先创建一个数据生产者每个订阅者一个生产者获取 数据,从订阅的那一刻开始

让我们将在Netflix上看电影与进入 电影院进行比较。把自己想象成一个观察者。任何决定在 Netflix 上观看 Mission: Impossible 的人都将获得整部电影,无论他们何时按下播放按钮。Netflix 创建了一个新的制作人,专门为您播放电影。这是一个冷的 observable

如果您去电影院并且放映时间是下午 4 点,则在下午 4 点创建制作人,并且流媒体开始。如果有些人(订户)迟到了,他们会错过电影的开头,只能从到达的那一刻开始观看。这是一个热门的 observable

冷观察到开始产生数据时一些代码调用 订阅()在其上的功能。例如,您的应用程序可能会声明一个 observable,在服务器上提供一个 URL 以获取某些产品。只有在您订阅时才会发出请求。如果另一个脚本向服务器发出相同的请求,它将获得相同的数据集。

一个热点观察的产生,即使没有用户感兴趣的数据。例如,智能手机中的加速度计会生成有关设备位置的数据,即使没有应用订阅此数据。即使没有用户对该股票感兴趣,服务器也可以生成最新的股票价格。

  • 喜欢移动的比喻——它现在将永远留在我的脑海中 (2认同)

Lee*_*ell 30

我希望这有帮助.

你能否对这些术语给出全面的定义?

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

在热门的观察中呼叫发布或在寒冷中推迟发布是否有意义?

不,不是我能想到的.

热/冷转换的哪些方面 - 例如,您是否丢失了消息?

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

IObservable和IEnumerable的热定义和冷定义之间是否存在差异?

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

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

请参阅第一点中的链接.我还建议您查看与RefCount一起使用的Publsh.这使您能够具有Cold Observables的Lazy评估语义,但可以共享Hot Observables获得的事件.

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

弄脏你的手并与他们玩耍.一旦你读了它们超过30分钟,那么用它们编写代码的时间对你来说要比阅读它们更有效率:)

  • 您博客的链接已失效 (5认同)

Ric*_*ein 19

即使您没有订阅观察者,热观察也会推动.像鼠标移动,或计时器滴答或类似的东西.冷可观察性是指仅在您订​​阅时才开始推送的,如果您再次订阅则会重新开始.

  • 明天是崭新的一天 ?;-) (15认同)
  • 这个答案是不正确的。热可观察量“不”是急切的。区别在于,冷可观察量为每个订阅创建一个观察者,而热可观察量仅创建一个观察者,并且**仅在至少有一个订阅者时**。 (3认同)
  • 孩子们?将在18年后再次入住。; ^ D(顺便说一句,我喜欢开始...一个很好的分步示例(而不是Lee的博客链接),即使在2019年也将不胜感激!) (2认同)

Ser*_*hov 10

不是假装给出一个全面的答案,我想以最简单的形式总结自我这个问题以来我学到的东西.

热观察与事件完全匹配.在事件中,即使没有订阅者正在侦听,值通常也会被送入处理程序.所有订阅者都收到相同的值集.由于遵循"事件"模式,热观察比冷酷观察更容易理解.

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

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