使用BehaviorSubject替代Subject(RxJs\Angular),是否存在任何缺点?

6

我正在处理一个项目,其中代码库的部分在使用BehaviorSubject时非常自由。在大多数情况下,当没有初始状态或需要在第一个明确的“onNext / emit”之外有一个初始值时使用。

我很难确定这是否有任何缺点?如果没有,为什么不所有人都只使用BehaviorSubject(即使没有参数构造)而不是标准Subject?

提前感谢!


3
为什么要用for循环,使用while循环就可以完成所有任务?为什么要使用Python,当你可以编写C语言呢?为什么要开车去上班,当你可以坐公交车呢? - Ingo Bürk
一个使用 Subject 的例子是,当您打开一个弹出窗口并监听鼠标点击事件以隐藏该弹出窗口时。您不想捕获最后一个鼠标事件只是为了丢弃它,而是要等待下一个事件。 - Harry Ninh
我理解你的意思,但除了它需要一个初始值这个事实之外,我不确定使用BehaviorSubject相比于Subject有什么影响。另外,正如我所说,我正在工作的项目中,由于先前提到的额外好处,似乎只使用了BehaviorSubject。因此,我试图了解更多关于这种类型的知识,以便更好地区分何时“开车而不是坐公交车”更好。 ;) - iHazCode
2个回答

9
一个BehaviorSubject与其他Subject不同之处在于它除了初始值外,还像ReplaySubject(1)一样。这意味着新的订阅者将始终同步获取最后(或初始)发出的值。而使用Subject时,只能获取订阅后发生的发射。
因此,如果您想在服务中存储数据,BehaviorSubject通常是一个很好的选择。另一方面,Subject可能更适合向订阅者发出事件。
换句话说,在您不关心过去的情况时,请使用Subject。
至于初始值,无论如何都是这样:如果您不需要它,请勿使用它。为什么?因为。我的意思是,您也可以随时编写
var x;
x = 5;

替代

var x = 5;

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

不要发出订阅者需要费力忽略的事件。一个典型的Angular案例是使用Subject,你在ngOnDestroy中发出+完成它,这样你就可以使用takeUntil来限制组件中的订阅。如果它是BehaviorSubject,它就行不通了。


谢谢,这非常有帮助。不确定为什么我无法从其他阅读中推断出这一点,但这对我以后区分使用哪个将会很有帮助。再次感谢! - iHazCode

1
重要的是要尊重两种Subject背后的原则。像大多数情况一样,每个选择都应由上下文确定。一些好的初始问题如下:
  1. 我是否有流的初始状态?
  2. 我需要一个快速简便的Observable/Observer引擎吗?
  3. 我真的只需要一个管理“next/complete/error”和订阅的对象吗?
  4. 订阅者需要接收最后发出的项目吗?
这些始终是好的问题类型,可以帮助您决定使用哪种Subject

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接