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

iHa*_*ode 6 rxjs angular

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

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

提前致谢!

Ing*_*ürk 8

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

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

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


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

var x;
x = 5;
Run Code Online (Sandbox Code Playgroud)

代替

var x = 5;
Run Code Online (Sandbox Code Playgroud)

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

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