冷观察的用例是什么?

时间:2016-05-01 15:29:32

标签: javascript rxjs observable

我理解冷热观察的区别,但我总是看到人们使用热的观察而不是冷;事实上,如果有人不小心使用冷观察,它被认为是一个错误,因为它常常是不良行为的原因。

你喜欢或使用寒冷观察者的情况是什么?

3 个答案:

答案 0 :(得分:5)

首先,我邀请您审核Hot and Cold observables : are there 'hot' and 'cold' operators?,以确保您对热与冷有充分的了解。

冷可观察性允许生产者的懒惰,这是一个非常理想的特征。当没有使用这些价值(没有消费者)时,产生价值(生产可能是昂贵的)是浪费。因为这样的冷可观察物是构建块......从中可以获得更多热的可观测量。

因此,冷可观察量的最常见用例是懒惰地得出热的可观察量。如果你考虑一下,你需要以某种方式以编程方式构造这些热的可观察量。一种方法是使用主题(然后你是制片人)。另一种方法是通过运算符从其他预先存在的observable派生它们,预先存在的observable也来自其他等等。在链的末尾,你应该找到Rx.Observable.create,这是一个冷可观察的。

当您需要懒惰时,您可以使用冷可观察性(仅在有消费者时开始生成值,或者控制生产过程的开始)。例如,defer允许您仅在有消费者时启动生产者。例如,当你有一个热的可观察但你尚未准备好听它时,它可以被使用。

当您需要重现价值产生过程时,您还需要冷观察(每个新订户将重新启动相同的过程)。例如,这是用于测试目的的情况,您希望在不同的时间使用完全相同的序列多次但不同的消费者。

最后,这个问题听起来更像是一个哲学问题。您可以使用两种工具,重要的是了解您的需求,拥有的内容以及适用于您的用例的内容。

答案 1 :(得分:4)

答案的核心在于Ben Lesh的简洁摘要:

  

TL; DR:当你不想创建你的时候,你想要一个HOT observable   制作人一遍又一遍。

直接回答问题"你喜欢或使用寒冷的观察者的情况是什么?",我将提供一般答案和具体的例子。

通常,使用冷可观察对每次需要时创建的流进行建模比创建热流并试图纠缠它更方便。

具体来说,请考虑以下简单示例。假设您希望通过从10开始倒计时响应单击按钮。如果在倒计时期间再次单击该按钮,它将再次从10开始。如果单击$ models按钮事件,您可能会遇到以下情况:

const subscription = click$
  .flatMapLatest(_ => Rx.Observable.interval(1000).take(10))
  .select(x => 10 - x)
  .subscribe(x => console.log('clicked: ' + x));

考虑如何在没有冷可观察的情况下对其进行建模。你好吗:

  1. 提前初始化一个流,以便在需要时提供适当的值?
  2. 避免在间隔时间和订阅时间之间处理一小段时间?
  3. 处理可以从任何数字开始的序数而不仅仅是1?
  4. 管理流的清理逻辑?
  5. 1和3可以很容易地解决,但2和4是讨厌的。

    回答你的第二个问题"是懒惰吗?"我认为事实并非如此。冷观察可以留下它直到订阅产生其价值的那一刻。一个热的observable可以离开它,直到订阅钩住适当的事件。他们都以自己的方式懒惰(或者至少可以)。关键的区别在于Ben Lesh所说的:你想每次创建一个制作人吗?有时,你真的这么做。

答案 2 :(得分:2)

  

在热门的情况下,您更喜欢或使用冷观察的情况?

我希望我没有说明显而易见的,但是你想要从可观察的历史记录中访问所有值(或通过过滤整个集合而得到的某些子集)的任何情况。

第一个想到的例子是平均所有学生的考试成绩,而不仅仅是你订阅后已经达到的分数。