javascript - Angular 中的 Subject vs BehaviorSubject vs ReplaySubject

标签 javascript angular rxjs reactive-programming angular2-observables

我一直在寻求理解这 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/

相关文章:

css - 如何更改 ngx-pagination 的颜色?

javascript - 如何将抓取的收入数据发送到我的工具?

javascript - 输出数据中存在的嵌套 Handlebar 助手

javascript - 如何使用 Backbone.js 正确添加 jQuery UI 自动完成小部件

angular - 使用变量名进行错误检查的语法

javascript - 通过http调用获取配置后如何在Angular 7中动态初始化firebase

angular - Observable.map setTimeout 函数,返回类型为 Angular 5

node.js - 任何人都可以发布一个使用 node.js 查询 postgresql 数据库的 RXJS 示例吗?

angular - 我可以将 async/await Promises 与可观察的 RXJS 混合使用吗?

javascript - jQuery (Jira) XSRF 检查失败