我一直在寻找了解这 3 个:
我想使用它们并知道何时以及为什么,使用它们有什么好处,尽管我已经阅读了文档,观看了教程并搜索了谷歌,但我对此没有任何意义。
那么他们的目的是什么?一个真实的案例将不胜感激,它甚至不必编码。
我希望有一个清晰的解释,而不仅仅是“a+b => c you are subscribed to ....”
谢谢
它实际上归结为行为和语义。带一个
Subject- 订阅者只会获得订阅 后 发出的发布值。问问自己,这是你想要的吗?订阅者是否需要了解有关先前值的任何信息?如果没有,那么您可以使用它,否则选择其他之一。例如,组件到组件的通信。假设您有一个组件在单击按钮时发布其他组件的事件。您可以使用带有主题的服务进行通信。
Subject
BehaviorSubject- 最后一个值被缓存。订阅者将在初始订阅时获得最新值。该主题的语义是表示随时间变化的值。例如登录用户。初始用户可能是匿名用户。但是一旦用户登录,那么新值就是经过身份验证的用户状态。
BehaviorSubject
用BehaviorSubject初始值初始化。这有时对编码偏好很重要。比如说你用null. 然后在您的订阅中,您需要进行空检查。也许没问题,也许很烦人。
null
ReplaySubject
如果您ReplaySubject使用 的缓冲区大小初始化 a 1,那么它实际上的 行为 就像 a BehaviorSubject。最后一个值总是被缓存,所以它就像一个随时间变化的值。有了这个,就不需要像用 a 初始化null的情况那样进行检查了。在这种情况下,在第一次发布之前,不会向订阅者发送任何值。BehaviorSubject``null
1
BehaviorSubject``null
所以它真的归结为你所期望的行为(至于使用哪一个)。大多数时候,您可能想要使用 aBehaviorSubject因为您真正想要表示的是“随时间变化的价值”语义。ReplaySubject但我个人认为用初始化的替换没有任何问题1。
当你真正需要的是一些缓存行为时,你想要 避免 的是使用 vanilla 。Subject例如,您正在编写路由保护或解析。您在该守卫中获取一些数据并将其设置在 serviceSubject中。然后在路由组件中订阅服务主题以尝试获取在防护中发出的值。哎呀。价值在哪里?它已经发出了,DUH。使用“缓存”主题!