I watched the video我知道一般原则 - 即使没有人订阅也会发生热情,冷却发生在“按需”。 此外,Publish()将cold转换为hot,而Defer()将hot转换为cold。
但是,我觉得我错过了细节。以下是我想回答的一些问题:
答案 0 :(得分:27)
我希望这会有所帮助。
你能全面提供吗? 这些术语的定义是什么?
请参阅我的博文:http://leecampbell.blogspot.com/2010/08/rx-part-7-hot-and-cold-observables.html
打电话有意义吗? 在热的可观察或延迟上发布 感冒了吗?
不,不是我能想到的。
热/冷的哪些方面 转换 - 你丢失了消息, 例如?
当Observable为Hot时,可能会“丢失”消息,因为“事件”无论订阅者如何都会发生。
hot和。之间是否存在差异? IObservable和。的冷定义 IEnumerable的?
我真的不明白这个问题。我希望这个比喻有所帮助。我会将Hot Observable与热切评估的IEnumerable进行比较。即一个列表或一个数组都被热切评估,并且已经填充,即使没有人对它们进行说明。可以使用Yield关键字延迟评估从文件或数据库获取值的yield语句。虽然懒惰可能很好,但默认情况下,如果第二个枚举器在其上运行,则会重新评估。将这些与Observables进行比较,Hot Observable可能是一个事件(按钮点击)或温度馈送;无论订阅如何,这些事件都会发生,如果对同一个observale进行了多次订阅,也会共享这些事件。 Observable.Interval是Cold Observable的一个很好的例子。它只会在订阅时开始生成值。如果进行了多次订阅,那么将重新评估序列,并且“事件”将在单独的时间发生(取决于订阅之间的时间)。
在为冷或热编程时应该考虑哪些一般原则?
请参阅第一点中的链接。我还建议您查看与RefCount一起使用的Publsh。这使您能够具有Cold Observables的Lazy评估语义,但可以共享Hot Observables获得的事件。
关于热/冷的任何其他提示 可观测量?
弄脏你的手并与他们玩耍。一旦你读了它们超过30分钟,那么用它们编写代码的时间对你来说要比阅读它们更有成效:)
答案 1 :(得分:18)
即使您没有订阅观察者,热门观察者也会推动。像鼠标移动,或计时器滴答或类似的东西。寒冷的观察者只有在你订阅时才开始推动,如果你再次订阅就会重新开始。
答案 2 :(得分:9)
不是假装给出一个全面的答案,我想以最简单的形式总结自我提出这个问题以来所学到的知识。
热观察与事件完全匹配。在事件中,即使没有订阅者正在侦听,值通常也会被送入处理程序。所有订阅者都收到相同的值集。由于遵循“事件”模式,热点可观察量比冷点更容易理解。
冷可观察也像一个事件,但有一个转折 - Cold observable的事件不是共享实例上的属性,它是从工厂生成的对象上的属性有人订阅的时候。此外,订阅开始生成值。由于上述原因,多个订户被隔离,每个订户都收到自己的一组值。
RX初学者最常犯的错误是使用函数中的一些状态变量(f.e.累计总数)创建一个冷可观察对象(好吧,认为他们正在创建一个冷可观察对象),而不是将它包装到.Defer()语句中。因此,多个订阅者共享这些变量并导致它们之间产生副作用。
答案 3 :(得分:1)
来自:Anton Moiseev书“带打字稿的角度开发,第二版。”:
冷热观测
有两种类型的可观察对象:冷热。主要区别在于可观察的 为每个订户创建了数据生成器,而热可观察者先创建一个数据生产者,然后每个订阅者从一个生产者获取数据,< 从 订阅的那一刻开始。
让我们比较一下在 Netflix 上观看电影和进入电影院的情况。想想自己是一个观察者。任何决定在Netflix上观看《碟中谍》的人,无论何时按下播放按钮,都将获得整部电影。 Netflix创建了一个新的制片人,专门为您播放电影。这是可观察的。
如果您去电影院并且放映时间是下午4点,则制片人是在下午4点创建的,流媒体开始播放。如果某些人(订户)迟到了演出,他们会错过电影的开头,只能从到达的那一刻开始观看。这是可观察到的。
当某些代码在其上调用 subscribe()函数时,冷可观察开始产生数据。例如,您的应用可能声明了可观察到的在服务器上提供URL以获得某些产品的URL。仅当您订阅时才发出请求。如果另一个脚本向服务器发出相同的请求,它将获得相同的数据集。
可热观察会产生数据,即使没有订阅者对数据感兴趣。例如,即使没有应用程序订阅此数据,智能手机中的加速度计也会产生有关设备位置的数据。即使没有用户对此服务器感兴趣,服务器也可以产生最新的股票价格。
答案 4 :(得分:-2)
从概念上讲,observable只是一些数据或事件源的包装器,提供了一些方便的接口,可以将源视为实时更新其值的数据流。
在&#34;感冒&#34;版本,源不活动,可以与蓝图,类或原型进行比较。因此,观察者不会产生任何东西。像待处理或暂停的流。这使它成为一个纯值,您可以安全地传递给纯函数。一个很好的例子是一个暂停的计数器,它在激活时始终以1开始。
&#34;订阅&#34;冷静观察&#34;冷静观察&#34;意味着两件事:创建(或分叉)活动数据流实例并附加订阅者。第一部分类似于从类创建对象。第二部分是实际订阅,本身与第一部分无关。
&#34; hot observable&#34;已经是一个正在运行的实例。就像从原型创建并准备使用的对象一样。订阅仅涉及附加的实际观察者。不需要激活部件。