我理解冷热观察的区别,但我总是看到人们使用热观察而不是寒冷;事实上,如果有人不小心使用了可观察到的寒冷,这被认为是一个错误,因为它经常是不想要的行为的原因。
在什么情况下,你更喜欢或使用一个寒冷的观察比一个炎热的?
发布于 2016-05-04 12:55:43
答案的核心在于本·莱什的简洁总结:
当你不想一遍又一遍地创造你的制片人的时候,你想要一个可观察的热点。
在直接回答“什么情况下,你更喜欢或使用一个冷的观察比一个炎热的?”,我将提供一个一般的答案和一个具体的例子。
一般来说,使用冷观测来模拟每次需要创建的流要比创建一个热流并试图对其进行争论要方便得多。
具体来说,请考虑下面的简单示例。假设您希望通过从10开始倒数来响应对按钮的单击。如果在倒计时期间再次单击该按钮,则该按钮将在10开始。如果单击$模拟按钮事件,则可能会出现如下情况:
const subscription = click$
.flatMapLatest(_ => Rx.Observable.interval(1000).take(10))
.select(x => 10 - x)
.subscribe(x => console.log('clicked: ' + x));考虑一下,如果没有寒冷的观察,这将是如何建模的。你怎么会:
1和3可以很容易地解决,但2和4是令人讨厌的。
回答你的第二个问题:“是懒惰吗?”我认为事实并非如此。一个冷酷的可观察的人可以把它留在订阅的时刻,以产生它的价值。一个热门的可观察的,可以离开它直到订阅的时刻,以挂钩适当的事件。他们都以自己的方式懒惰(或者至少可以)。关键的区别在于Ben说过:你想每次都创建一个制片人吗?有时候,你真的知道。
发布于 2016-05-03 20:30:09
首先,我请您回顾一下Hot and Cold observables : are there 'hot' and 'cold' operators?,以确保您对热与冷有一个全面的理解。
严寒的观察允许生产者的懒散,这是一个非常可取的特点。在没有利用价值(没有消费者)的情况下,产生价值(生产可能是昂贵的)是一种浪费。因为如此寒冷的观测值是建筑的基石..。更多的情况下产生的是热观测值。
因此,最常见的冷观测数据用例是懒洋洋地导出热点可观测数据。如果你想一想,你需要用编程的方式来构造这些热点观测数据。一种方法是使用主语(然后你就是制片人)。另一种方法是通过运算符从其他已存在的可观测数据中派生出它们,也可以从其他观测到的观测数据中导出它们等等。在链的末尾,您应该找到Rx.Observable.create,这是一个可以观察到的寒冷现象。
当你需要懒惰时,你会使用冷观察(只有当有消费者的时候才开始生产价值,或者控制生产过程的开始)。例如,defer只允许在有消费者的情况下启动生产者。例如,当你有一个可以观察到的热点,但你还没有准备好去听它的时候,你就可以使用它。
当您需要复制一个价值生成过程(每个新的订阅者将重新启动相同的进程)时,您还需要冷的可观察性。例如,为了测试目的,您需要多次使用完全相同的序列,但在不同的用户和不同的时间使用相同的序列。
最后,这个问题听起来更像是一个哲学问题。您有两个工具可供使用,重要的是了解您所需要的、拥有的以及适用于您的用例的工具。
发布于 2016-05-03 19:22:49
在什么情况下,你更喜欢或使用一个寒冷的观察比一个炎热的?
我希望我不是在陈述显而易见的情况,而是希望访问可观察到的历史记录中的所有值(或通过过滤完整集获得的子集)的任何情况。
我想到的第一个例子是一个学生的所有考试成绩的平均值,而不仅仅是你订阅后的分数。
https://stackoverflow.com/questions/36968402
复制相似问题