RXJS中Subject, BehaviorSubject, ReplaySubject, AsyncSubject的区别?

在RxJS(Reactive Extensions for JavaScript)中,Subject、BehaviorSubject、ReplaySubject和AsyncSubject都是Observable的变体,它们用于处理观察者模式中的不同场景。以下是它们之间的主要区别:

1、Subject:
是一种特殊的Observable,同时也是观察者。可以通过调用next()方法向Subject中推送新的值。
在订阅Subject时,可以接收到订阅之后产生的值。
没有初始值,也没有缓存历史值的功能。
在这里插入图片描述
上面例子就比较容易理解:

  • 我们创建了一个Subject
  • 发出了一个值1,但由于此时并没有订阅者,所以这个值不会被订阅到
  • 创建了订阅者 A
  • 又发出一个值 2,这时候订阅者 A 会接收到这个值
  • 又创建一个订阅者 B
  • 最后发出一个值 3,这时候已经订阅的都会接收到这个值

2、BehaviorSubject:
是一种特殊的Subject,具有初始值。
在订阅时,会立即收到当前的值,然后在之后每次Subject发出新值时,订阅者都会收到更新后的值。
保留并提供对当前值的访问。
在这里插入图片描述
这段代码做了那些工作呢?

  • 我们首先创建了一个BehaviorSubject的实例behavior$,并在实例化时传入初始值 0。
  • 然后我们订阅了这个这个实例behavior$,由于BehaviorSubject的特点是把最新的值发布给订阅者,订阅者 A 会得到初始值 0,所以就会打引出订阅者 A,订阅值为:0
  • behavior$使用内置的next方法发出一个新的值 1,这时候订阅者 A 将会收到新的值,打印出订阅者 A,订阅值为 1
  • 我们增加一个订阅者 B,这时候它会得到最新的值 1,所以打印结果为订阅者B,订阅值为 1
  • 最后我们再一次调用behavior$的next方法,由于我们之前已经订阅了两次,所以订阅者 A 和订阅者 B 都会接收到新的value

3、ReplaySubject
会在订阅时接收一定数量的历史值(缓存)。
可以指定缓存的大小,当新的值推送到ReplaySubject时,最早的值会从缓存中移除。
适用于需要让订阅者获取历史值的场景。

在这里插入图片描述
这里发生了一些事情:

  • 我们创建了一个ReplaySubject的实例replay$,并指定我们只想存储最后两个值
  • 我们创建了一个订阅者 A
  • 调用三次replay$的next方法,把值发布给订阅者。这时订阅者 A 将会打印三次
  • 现在就来体验ReplaySubject的魔力。我们使用replay$创建了一个新的订阅者 B,由于我们告诉ReplaySubject,存储两个值,因此它将直接向订阅者 B 发出这些最后的值,订阅者 B 将打印出这些值。
  • replay$发出另外一个值,这时候,订阅者 A 和订阅者 B 都接收到值的改变,打印出另外一个值

你还可以指定值在ReplaySubject存储的时间,我们来看一个例子:
在这里插入图片描述
上面代码中发生了那些事情呢:

  • 我们创建了ReplaySubject,并指定它只存储最后两个值,但是不超过 100ms
  • 创建一个订阅者 A
  • 我们开始每 200ms 发出一个新的值。订阅者 A 会接收到发出的所有值
  • 我们创建一个订阅者 B,由于是在 1000ms 后进行订阅。这意味着在开始订阅之前,replay 已经发出了 5 个值。在创建ReplaySubject时,我们指定最多存储 2 个值,并且不能超过 100ms。这意味着在 1000ms 后,订阅者 B 开始订阅时,由于replay 是 200ms 发出一个值,因此订阅者 B 只会接收到 1 个值。

4、AsyncSubject:
只有在Subject完成时,订阅者才会收到最后一个值。
可以看作是在Observable完成时发射最后一个值的特殊Subject。
适用于只关心Observable完成时的结果的场景。

const asyncSubject = new AsyncSubject();
asyncSubject.subscribe(value => console.log(value));
asyncSubject.next(1);
asyncSubject.next(2);
asyncSubject.complete(); // 输出: 2

总的来说,这些Subject的选择取决于使用场景。BehaviorSubject适用于需要初始值的场景,ReplaySubject适用于需要缓存历史值的场景,AsyncSubject适用于只关心Observable完成时的结果的场景,而普通的Subject则是一个简单的广播机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AGI是否应该具备基础的常识模型

通用人工智能(AGI)是指能够理解或学习任何人类或其他动物能够做的智力任务的人工智能系统,它是人工智能领域的终极目标之一。 AGI 的研究范式是指在 AGI 领域中,研究者们所遵循的一些基本的理念、方法和目标。 AGI 是否应该存在基…

使用 Picocli 开发 Java 命令行,5 分钟上手

大家好,我是鱼皮,对不会前端的同学来说,开发 命令行工具 是一种不错的展示系统功能的方式。在 Java 中开发命令行工具也很简单,使用框架,几分钟就能学会啦~ Picocli 入门 Picocli 是 Java 中个人认为功能最完善、最简单…

Android系统开发之浅谈广播接收器回调

广播接器BroadcastReceiver 广播Intent和广播接收器BroadcastReceiver,是大家android开发用的特别多的二个控件。 那如何从系统角度看待广播和广播接收器呢? 对于静态注册BroadcastReceiver和动态注册的BroadcastReceiver是如何回调其onReceive方法呢…

Docker网络配置

网络相关 子网掩码 互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。 IP 地址在设计时就考虑到地址分配的层次特点,将每个 IP地址都分割成网络号和主机号两部分,以便于IP 地址的寻址操作。…

从0到1:实验室设备借用小程序开发笔记

概论 实验室设备借用小程序,适合各大高校,科技园区,大型企业集团的实验室设备借用流程, 通过数字化的手段进一步提升相关单位设备保障水平,规范实验室和设备管理,用户通过手机小程序扫描设备的二维码,可以…

YOLOv5改进系列(26)——添加RFAConv注意力卷积(感受野注意力卷积运算)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2)——添加CBAM注意力机制 YOLOv5改进系列&…

Redis在Windows10中安装和配置

1.首先去下载Redis 这里不给出下载地址,自己可以用去搜索一下地址 下载 下载完成后解压到D盘redis下,本人用的是3.2.100 D:\Redis\Redis-x64-3.2.100 2.解压完成后需要设置环境变量,这里新建一个系统环境变量中path 中添加一个文件所…

如何用GPT 运行python?GPT4科研应用与AI绘图及论文高效写作

详情点击链接:如何用GPT 运行python?GPT4科研应用与AI绘图及论文高效写作 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型…

计算机导论07-算法和数据结构

文章目录 算法基础算法及其特性算法的概念算法与程序算法表示 算法的描述自然语言流程图盒图(N-S图)伪代码程序设计语言 算法评价算法的衡量标准算法的规模时间复杂度空间复杂度 数据结构数据结构的概念数据的逻辑结构数据的存储结构数据的基本操作 常用…

6.3.4录制屏幕

6.3.4录制屏幕 除了可以进行声音录制外,Camtasia4还允许录制屏幕上的各种操作,并且在录制视频的同时还可以混入讲解,这在制作视频教程时很有用处。 1.在Camtasia Studio主程序中,单击【工具】|【Camtasia录像器】&am…

抖店商家对接带货主播建议,远离头部主播保平安,附沟通话术模板

我是王路飞。 抖店出单玩法中,商品卡属于靠天吃饭,有一定的风险,所以不建议新手选择。 我们自己包括学生做店,一直都是以达人模式为主的,主要是可控(风险可控,数据可控,流程可控&a…

Qt第二周周二作业

代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void paintEvent(…

CAD 相关技巧

空格键&#xff1a; &#xff08;1&#xff09;确认操作 &#xff08;2&#xff09;重复上一步操作删除键&#xff1a;E直线命令&#xff1a;输入L选择方式&#xff1a;框选与点选&#xff0c;对于框选&#xff1a;左框选&#xff0c;必须全部框选完才会被选择&#xff0c;右框…

FTP文件传输协议 、多种方式安装yum仓库

一、网络文件共享服务 1.存储类型分三种&#xff1a; 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储…

【算法分析与设计】跳跃游戏

题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - …

液晶偏振光栅

1、偏振 光是横波.在垂直于光的传播方向的平面内光波振动(即E矢量振动) 各方向振幅都相等的光为自然光; 只在某一方向有光振动的光称为线偏振光;各方向光振动都有,但振幅不同的光叫部分偏振光.螺旋着振动的光称圆偏振光&#xff0c;分旋和右旋 2、庞加莱球表示法 庞加莱球是用…

框架基础-Maven+SpringBoot入门

框架基础 Maven基础 Maven概述 Maven是为Java项目提供项目构建和依赖管理的工具 Maven三大功能 - 项目构建构建&#xff1a;是一个将代码从开发阶段到生产阶段的一个过程&#xff1a;清理&#xff0c;编译&#xff0c;测试&#xff0c;打包&#xff0c;安装&#xff0c;部署…

解决kali beef启动失败解问题

只限于出现这个提示的时候使用 卸载 ruby apt remove ruby 卸载 beef apt remove beef-xss 重新安装ruby apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine 重新安装beef apt-get install beef-xss 弄完以上步骤如果还是不行就重启kali再试…

Axure租房平台用户端APP原型图,房屋租赁高保真模板45页

作品概况 页面数量&#xff1a;共 40 页 兼容软件&#xff1a;仅支持Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;租房平台、房屋租赁领域 作品特色 本作品为房屋租赁用户端app原型&#xff0c;产品定位为&#xff1a;提供本地租房信息、出租房源信息…

MFC CAsyncSocket类作为客户端示例

之前写过CAsyncSocket类使用的博客;进一步看一下; VS新建一个MFC 对话框工程; 添加一个类,从CAsyncSocket继承,起个自己的名字; 对话框添加几个编辑框,按钮,静态控件; 为自己的CxxxAsyncSocket类添加重写的虚函数,OnConnect、OnReceive、OnSend; 自己的CAsyncSoc…