冷观察的用例是什么?

m0m*_*eni 16 javascript observable rxjs

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

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

use*_*222 5

首先,我邀请您查看Hot and Cold可观测量:是否存在"热"和"冷"运算符?确保你对热与冷的透彻理解.

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

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

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

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

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


Mat*_*ell 4

答案的核心在于 Ben Lesh 的简洁总结:

\n\n
\n

TL;DR:当您不想一遍又一遍地创建生产者时,您需要一个 HOT observable。

\n
\n\n

在直接回答“在什么情况下您更喜欢或使用冷可观察值而不是热可观察值?”这一问题时,我将提供一般答案和具体示例。

\n\n

一般来说,使用冷可观察对象对每次需要时创建的流进行建模比创建一个热可观察对象并尝试对其进行争论要方便得多。

\n\n

具体来说,请考虑以下简单示例。假设您想通过从 10 开始倒计时来响应按钮的点击。如果在倒计时期间再次单击该按钮,则它会再次从 10 开始。如果 click$ 为按钮事件建模,您可能会得到如下结果:

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

考虑如何在没有冷可观测值的情况下对其进行建模。你会怎样:

\n\n
    \n
  1. 提前初始化流以便在需要时可以使用适当的值?
  2. \n
  3. 避免处理间隔滴答声和订阅时间之间的几分之一秒?
  4. \n
  5. 处理可以从任意数字开始而不仅仅是 1 的序数吗?
  6. \n
  7. 管理流的清理逻辑?
  8. \n
\n\n

1和3很容易解决,但2和4就很糟糕了。

\n\n

回答你的第二个问题“这是懒惰吗?” 我认为事实并非如此。冷可观察量可以将其保留到订阅时刻以产生其值。热可观察对象可以将其保留到订阅时刻以挂钩适当的事件。他们都以自己的方式懒惰(或者至少可以如此)。关键的区别在于Ben Lesh所说的:每次都要创建一个制作人吗?有时,你确实这么做了。

\n