总是使用BehaviorSubject而不是Subject(RxJs \ Angular)的任何缺点?

时间:2018-03-27 05:04:12

标签: angular rxjs

我正在开发一个项目,其中部分代码库非常自由地使用BehaviorSubject。在大多数情况下,在没有初始状态时使用,或者需要在第一个显式" onNext / emit"之外有一个初始值。

我很难确定这是否有任何不利因素?如果没有,为什么每个人都不会总是使用BehaviorSubject(甚至没有参数构建)而不是标准的主题?

提前致谢!

2 个答案:

答案 0 :(得分:7)

一个BehaviorSubject与除了初始值之外的Subject完全不同:它也像ReplaySubject(1)一样。这意味着新订户将始终获得同步发出的最后一个(或初始)值。使用主题,您只能获得订阅后发生的排放。

因此,如果您希望将数据存储在服务中,则BehaviorSubject通常是一个不错的选择。另一方面,主题可能更适合向订阅者发送事件。

换句话说,当你不关心过去时,使用主题。

就初始值而言,无论这些效果如何:如果您不需要,请不要使用。为什么?因为。我的意思是你也可以随时写

var x;
x = 5;

而不是

var x = 5;

但是......你为什么要这样做?

不要发出订阅者需要努力忽略的事件。典型的Angular案例是使用您在ngOnDestroy中发出+完成的主题,因此您可以使用takeUntil来限制组件中的订阅。如果它是一个BehaviorSubject,它就行不通。

答案 1 :(得分:1)

因为你不尊重两种主题背后的原始原则。在大多数情况下,您的所有选择都应根据您的背景来确定。这将是:

  1. 我的流有初始状态吗?
  2. 我需要快速简便的Observable / ver引擎吗?
  3. 您真的只需要一个管理“next / complet / error”和订阅的对象吗?
  4. 作为订阅者,您是否需要接收最后发出的项目?
  5. 正如你所看到的,我已经说明了许多可以帮助你决定去某种Observable的案例