我一直想了解这三点:

我想要使用它们,知道使用它们的时间和原因,使用它们的好处是什么,尽管我已经阅读了文档,看了教程,并在谷歌上搜索了一下,但我还是没能理解这一点.

那么他们的目的是什么?一个真实世界的 case ,如果它甚至不需要编码,那将是最受欢迎的.

我希望有一个清晰的解释,而不仅仅是"a+b=>c您订阅的……"

谢谢

推荐答案

这实际上可以归结为行为和语义.用一个

  • Subject-订阅服务器将只获取订阅发出的已发布值.问问自己,这就是你想要的吗?订阅者是否需要了解以前的值?如果没有,那么你可以使用这个,否则就从其他选项中 Select 一个.例如,使用组件到组件的通信.假设您有一个组件,可以通过单击按钮发布其他组件的事件.您可以使用带有主题的服务进行交流.

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

    BehaviorSubject用一个初始值初始化.这有时对编码偏好很重要.比如说,你用null初始化它.然后在订阅中,需要执行空判断.也许还可以,也许很烦人.

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

    如果用1的缓冲区大小初始化ReplaySubject,那么它实际上是behaves,就像BehaviorSubject一样.最后一个值总是被缓存的,所以它就像一个随时间变化的值.这样,就不需要像用null初始化的BehaviorSubject那样进行null判断.在这种情况下,在首次发布之前,不会向订阅服务器发送任何值.

因此,这实际上取决于您期望的行为(至于使用哪种行为).大多数情况下,您可能希望使用BehaviorSubject,因为您真正想要表示的是"随时间变化的值"语义.但是我个人看不出用1初始化的ReplaySubject的替换有什么错.

你想要的是使用vanilla Subject,而你真正需要的是一些缓存行为.例如,您正在编写路由保护或解决方案.你在那个防护装置中获取一些数据,并将其设置在服务Subject中.然后在路由组件中,您订阅服务主题,以try 获取防护中发出的值.哎呀.价值在哪里?它已经被释放了.使用"缓存"主题!

另见:

Javascript相关问答推荐

如何在不使用类型化数组的情况下将32位浮点数按位转换为整值?

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

没有输出到带有chrome.Devtools扩展的控制台

无法在nextjs应用程序中通过id从mongoDB删除'

Snowflake JavaScript存储过程返回成功,尽管预期失败

屏幕右侧屏障上的产卵点""

在open shadow—root中匹配时,使用jQuery删除一个封闭的div类

如何在.NET Core中将chtml文件链接到Java脚本文件?

钛中的onClick事件需要在两次点击之间等待几秒钟

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

将基元传递给THEN处理程序

在Odoo中如何以编程方式在POS中添加产品

Phaser3 preFX addGlow不支持zoom

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

无法设置RazorPay订阅API项目价格

使用线性插值法旋转直线以查看鼠标会导致 skip

如何更改Html元素S的 colored颜色 ,然后将其褪色为原始 colored颜色

如何使用Cypress在IFRAME中打字

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?