我正在开发一个项目,其中部分代码库非常自由地使用BehaviorSubject。在大多数情况下,在没有初始状态时使用,或者需要在第一个显式" onNext / emit"之外有一个初始值。
我很难确定这是否有任何不利因素?如果没有,为什么每个人都不会总是使用BehaviorSubject(甚至没有参数构建)而不是标准的主题?
提前致谢!
答案 0 :(得分:7)
一个BehaviorSubject与除了初始值之外的Subject完全不同:它也像ReplaySubject(1)一样。这意味着新订户将始终获得同步发出的最后一个(或初始)值。使用主题,您只能获得订阅后发生的排放。
因此,如果您希望将数据存储在服务中,则BehaviorSubject通常是一个不错的选择。另一方面,主题可能更适合向订阅者发送事件。
换句话说,当你不关心过去时,使用主题。
就初始值而言,无论这些效果如何:如果您不需要,请不要使用。为什么?因为。我的意思是你也可以随时写
var x;
x = 5;
而不是
var x = 5;
但是......你为什么要这样做?
不要发出订阅者需要努力忽略的事件。典型的Angular案例是使用您在ngOnDestroy中发出+完成的主题,因此您可以使用takeUntil来限制组件中的订阅。如果它是一个BehaviorSubject,它就行不通。
答案 1 :(得分:1)
因为你不尊重两种主题背后的原始原则。在大多数情况下,您的所有选择都应根据您的背景来确定。这将是:
正如你所看到的,我已经说明了许多可以帮助你决定去某种Observable的案例