gpt4 book ai didi

javascript - Angular 中的 Subject vs BehaviorSubject vs ReplaySubject

转载 作者:IT王子 更新时间:2023-10-29 02:48:45 25 4
gpt4 key购买 nike

我一直在寻求理解这 3 个:

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

那么他们的目的是什么?非常感谢真实案例,它甚至不必编写代码。

我更喜欢一个清晰的解释,而不仅仅是“a+b => c 你订阅了……”

谢谢

最佳答案

这实际上归结为行为和语义。用一个

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

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

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

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

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

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

你想要避免的是在你真正需要的是一些缓存行为时使用 Vanilla Subject。举个例子,你正在写一个路由守卫或一个解决方案。您在该守卫中获取一些数据并将其设置在服务 Subject 中。然后在路由组件中,您订阅服务主题以尝试获取在守卫中发出的值。哎呀。值(value)在哪里?它已经发出了,DUH。使用“缓存”主题!

另见:

关于javascript - Angular 中的 Subject vs BehaviorSubject vs ReplaySubject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43118769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com