小编典典

Angular 中的 Subject vs BehaviorSubject vs ReplaySubject

all

我一直在寻找了解这 3 个:

我想使用它们并知道何时以及为什么,使用它们有什么好处,尽管我已经阅读了文档,观看了教程并搜索了谷歌,但我对此没有任何意义。

那么他们的目的是什么?一个真实的案例将不胜感激,它甚至不必编码。

我希望有一个清晰的解释,而不仅仅是“a+b => c you are subscribed to ....”

谢谢


阅读 104

收藏
2022-06-22

共1个答案

小编典典

它实际上归结为行为和语义。带一个

  • Subject- 订阅者只会获得订阅 发出的发布值。问问自己,这是你想要的吗?订阅者是否需要了解有关先前值的任何信息?如果没有,那么您可以使用它,否则选择其他之一。例如,组件到组件的通信。假设您有一个组件在单击按钮时发布其他组件的事件。您可以使用带有主题的服务进行通信。

  • BehaviorSubject- 最后一个值被缓存。订阅者将在初始订阅时获得最新值。该主题的语义是表示随时间变化的值。例如登录用户。初始用户可能是匿名用户。但是一旦用户登录,那么新值就是经过身份验证的用户状态。

BehaviorSubject初始值初始化。这有时对编码偏好很重要。比如说你用null.
然后在您的订阅中,您需要进行空检查。也许没问题,也许很烦人。

  • ReplaySubject- 它可以缓存指定数量的排放。任何订阅者都将在订阅时获得所有缓存的值。你什么时候需要这种行为?老实说,我没有任何需要这种行为,除了以下情况:

如果您ReplaySubject使用 的缓冲区大小初始化 a 1,那么它实际上的 行为 就像 a
BehaviorSubject。最后一个值总是被缓存,所以它就像一个随时间变化的值。有了这个,就不需要像用 a
初始化null的情况那样进行检查了。在这种情况下,在第一次发布之前,不会向订阅者发送任何值。BehaviorSubject``null

所以它真的归结为你所期望的行为(至于使用哪一个)。大多数时候,您可能想要使用
aBehaviorSubject因为您真正想要表示的是“随时间变化的价值”语义。ReplaySubject但我个人认为用初始化的替换没有任何问题1

当你真正需要的是一些缓存行为时,你想要 避免 的是使用 vanilla
Subject例如,您正在编写路由保护或解析。您在该守卫中获取一些数据并将其设置在
serviceSubject中。然后在路由组件中订阅服务主题以尝试获取在防护中发出的值。哎呀。价值在哪里?它已经发出了,DUH。使用“缓存”主题!

2022-06-22