什么是冷热观测值?
Posted
技术标签:
【中文标题】什么是冷热观测值?【英文标题】:What are the Hot and Cold observables? 【发布时间】:2011-02-01 01:15:21 【问题描述】:I watched the video 我知道一般原则 - 即使没有人订阅,热也会发生,冷会“按需”发生。 此外,Publish() 将冷转换为热,而 Defer() 将热转换为冷。
但是,我仍然觉得我错过了细节。以下是我想回答的一些问题:
您能否对这些术语给出一个全面的定义? 在热的 observable 上调用 Publish 或在冷的 observable 上调用 Defer 是否有意义? 热/冷转换有哪些方面 - 例如,您会丢失消息吗? IObservable 和 IEnumerable 的热定义和冷定义有区别吗? 在进行冷或热编程时应考虑哪些一般原则? 关于热/冷 observables 的任何其他提示?【问题讨论】:
另见IConnectableObservables in Rx 【参考方案1】:来自:Anton Moiseev 的书“Angular Development with Typescript, Second Edition.”:
冷热观测
两种类型的observables:热和冷。主要的 区别在于 cold observable 创建 数据 每个订阅者的生产者,而热可观察 首先创建一个数据生产者,然后每个订阅者获得 数据来自一个制作人,开始从那一刻 订阅。
让我们将在 Netflix 上观看 电影 与进入 电影院。把自己想象成一个观察者。任何决定在 Netflix 上观看 Mission:Impossible 的人都将获得完整的 电影,无论他们何时按下播放按钮。 Netflix 创建了一个 新的制片人为您播放电影。这是感冒 可观察到的。
如果你去电影院,放映时间是下午 4 点,制片人 下午 4 点创建,流式传输开始。如果有些人 (订阅者)迟到了,他们错过了节目的开始 电影,只能从到达那一刻开始观看。这 是一个hot observable。
当某些代码调用 subscribe() 函数就可以了。例如,您的应用可能会声明一个可观察对象,在服务器上提供 URL 以获取某些产品。这 只有在您订阅时才会发出请求。如果另一个脚本 向服务器发出相同的请求,它会得到相同的数据集。
即使没有订阅者,hot observable 也会产生数据 对数据感兴趣。例如,您的加速度计 智能手机会生成有关您设备位置的数据,即使没有 应用订阅此数据。一台服务器可以生产最新的库存 即使没有用户对此股票感兴趣,也可以定价。
【讨论】:
那么一个是工厂,另一个是运行实例?那么它不应该被称为“可观察工厂”吗? 喜欢搬家的比喻——现在它会永远留在我的脑海里 所以我们可以说 Hot observables 是 Eager 加载的,Cold observables 是 Lazy 加载的吗? 你是个天才!谢谢,我再也不用谷歌了:D 电影类比很贴切。谢谢。【参考方案2】:Hot observables 是当你没有订阅 observable 时推送事件的。像鼠标移动,或计时器滴答声或类似的东西。 Cold observable 是仅在您订阅时才开始推送的对象,如果您再次订阅,它们会重新开始。
【讨论】:
看到这个帖子我很惊讶,我只写了一半,这只是告诉你你已经知道的,对不起。今晚写完太晚了。我明天会用一些代码示例更新它。 孩子?将在 18 年后再次入住。 ;^D(顺便说一句,我喜欢这个开始......即使在 2019 年,我也会很感激一个好的、循序渐进的例子(而不是 Lee 的博客链接)!) 这个答案不正确。 Hot observables 不渴望。不同之处在于冷可观察对象为每个订阅创建一个观察者,而热可观察对象仅创建一个观察者,并且仅当至少有一个订阅者时。 @Distortum 对于时间和上下文来说是正确的。 Hot observables 通常是在没有订阅者的情况下触发事件的事物。我是从创作者那里得到的。所以,也许这已经改变了,但它在发布时是正确的,并且对于上下文来说已经足够了。随意扩展答案。【参考方案3】:我希望这会有所帮助。
你能不能给出一个全面的 这些术语的定义?
请参阅我的博文:https://leecampbell.com/2010/08/19/rx-part-7-hot-and-cold-observables
打电话有意义吗 在热可观察或延迟上发布 感冒了吗?
不,我想不到。
热/冷有哪些方面 转换 - 您是否丢失了消息, 例如?
当 Observable 为 Hot 时,可能会“丢失”消息,因为无论订阅者如何,“事件”都会发生。
热和热之间有区别吗 IObservable 的冷定义和 IEnumerable?
我真的不明白这个问题。我希望这个类比有所帮助。我会将 Hot Observable 与 Eagerly 评估的 IEnumerable 进行比较。即一个列表或一个数组都被急切地评估并且已经被填充,即使没有人枚举它们。从文件或数据库中获取值的 yield 语句可以使用 Yield 关键字进行惰性求值。虽然惰性可能很好,但默认情况下,如果第二个枚举器运行它,它会被重新评估。将这些与 Observables 进行比较,Hot Observable 可能是事件(按钮单击)或温度源;无论订阅如何,这些事件都会发生,并且如果对同一个观测值进行了多个订阅,这些事件也会被共享。 Observable.Interval 是 Cold observable 的一个很好的例子。它只会在订阅时开始产生值。如果进行了多次订阅,则将重新评估序列,并且“事件”将在不同的时间发生(取决于订阅之间的时间)。
在进行冷或热编程时应考虑哪些一般原则?
请参阅第一点中的链接。我还建议您研究与 RefCount 一起使用的 Publsh。这使您能够拥有冷 Observables 的惰性求值语义,但共享 Hot Observables 获得的事件。
关于热/冷的任何其他提示 可观察的?
弄脏你的手,和他们一起玩。一旦你阅读了超过 30 分钟的内容,那么花在编写代码上的时间对你来说比阅读更多内容更有效率:)
【讨论】:
您博客的链接已失效 链接对我来说似乎很好。您是否可能被公司防火墙阻止?替代链接是leecampbell.blogspot.co.uk/2010/08/… 或更新的introtorx.com/Content/v1.0.10621.0/…。 这里有一个延迟冷可观察的用例:blog.danlew.net/2015/07/23/… 这是一个延迟热可观察的例子。 RxJava 的Just
很热/渴望
正确的链接是:leecampbell.com/2010/08/19/rx-part-7-hot-and-cold-observables(你的答案是:leecampbell.blogspot.com/2010/08/…)【参考方案4】:
不假装给出一个全面的答案,我想用最简单的形式总结一下我从这个问题开始以来所学到的知识。
Hot observable 与事件完全匹配。在事件中,即使没有订阅者在监听,通常也会将值馈入处理程序。所有订阅者都收到相同的一组值。由于遵循“事件”模式,热的 observables 比冷的 observables更容易理解。
Cold observable 也像一个事件,但有一点不同——Cold observable 的事件不是共享实例的属性,它是每个从工厂生成的对象的属性有人订阅的时间。此外,订阅开始生成值。由于上述原因,多个订阅者是孤立的,每个订阅者都会收到自己的一组值。
RX 初学者最常犯的错误是使用函数中的一些状态变量(例如累计总数)创建冷可观察对象(好吧,认为他们正在创建冷可观察对象),而不是将其包装到 .Defer() 语句中。结果,多个订阅者共享这些变量并在它们之间产生副作用。
【讨论】:
以上是关于什么是冷热观测值?的主要内容,如果未能解决你的问题,请参考以下文章