Angular Subject和BehaviorSubject之间的区别

news/2024/5/13 0:27:00

        Subject和BehaviorSubject是RxJS中两种常用的Subject类型。

概念:

  1. Subject

    • Subject是一种特殊的Observable,同时也是Observer。它可以被用来订阅Observable,也可以手动向它推送新的值。
    • Subject是一种热Observable,它会在订阅时开始推送值,而不管它们何时被推送。
    • Subject不会缓存最新的值,新的订阅者只能接收到订阅后推送的值,而无法获取之前推送的值。
    • Subject适用于需要将事件转换为Observable的场景,或者在多个订阅者之间共享相同的Observable。
  2. BehaviorSubject

    • BehaviorSubject是一种特殊的Subject,它会缓存最新的值,并在有新的订阅者订阅时立即发送这个最新值给订阅者。
    • BehaviorSubject需要一个初始值作为参数,在没有收到任何值时会发送这个初始值给订阅者。
    • BehaviorSubject适用于需要保存当前状态并让新订阅者立即获取到最新状态的场景。
    • BehaviorSubject常用于管理应用程序的状态,例如全局的用户身份验证状态、主题颜色等。

区别:

  1. 初始值

    • Subject在创建时不需要指定初始值,而且第一个订阅者只会收到Subject之后调用next()方法推送的值。
    • BehaviorSubject在创建时需要指定一个初始值,这个初始值会立即发送给所有订阅者,无需等待调用next()方法。
  2. 订阅时机

    • 对于Subject,如果订阅发生在next()方法之后,订阅者将不会收到之前已经通过next()方法推送的值。
    • 对于BehaviorSubject,无论订阅发生在何时,订阅者都会立即收到最新的值,包括初始值和之后通过next()方法推送的值。
  3. 缓存最新值

    • Subject不会缓存最新的值,每次调用next()方法都会向所有订阅者发送新值。
    • BehaviorSubject会保存最新推送的值,无论是通过next()方法推送的值还是初始值,并在有新订阅者订阅时立即发送这个最新值给订阅者。
    • 当有新的订阅者订阅BehaviorSubject时,它会立即收到缓存的最新值,即使之前已经有值被推送过,而不是等待下一次值的推送。

示例:

        两者明显的区别在于Subject不会缓存最新的值,而BehaviorSubject会缓存最新的值,并在有新的订阅者订阅时立即发送这个最新值给订阅者。下面是有关详细说明这两者之间的区别的代码示例:

  • 首先,我们创建一个Subject和一个BehaviorSubject,并分别订阅它们:
import { Subject, BehaviorSubject } from 'rxjs';// 创建一个 Subject
const subject = new Subject<number>();// 创建一个 BehaviorSubject,初始值为0
const behaviorSubject = new BehaviorSubject<number>(0);// 订阅 Subject
subject.subscribe(value => console.log('Subject Subscription:', value));// 订阅 BehaviorSubject
behaviorSubject.subscribe(value => console.log('BehaviorSubject Subscription:', value));
  • 接下来,我们分别向SubjectBehaviorSubject推送值,并再次订阅它们: 
// 向 Subject 推送值
subject.next(1);// 向 BehaviorSubject 推送值
behaviorSubject.next(1);// 再次订阅 Subject
subject.subscribe(value => console.log('Subject Subscription 2:', value));// 再次订阅 BehaviorSubject
behaviorSubject.subscribe(value => console.log('BehaviorSubject Subscription 2:', value));
  •  运行以上代码后,我们可以看到以下输出:
Subject Subscription: 1
BehaviorSubject Subscription: 0
BehaviorSubject Subscription: 1
Subject Subscription 2: 1
BehaviorSubject Subscription 2: 1

示例总结:

        上面的示例很好的说明了它们最明显的区别:会不会缓存最新的值。什么叫会缓存最新的值呢?

简单来说就是

        缓存最新值就是保存了最新值的意思,也就是说BehaviorSubject 从它订阅开始就一定会收到值,要不就是初始值,要不就是最新一次的next()方法的传递的值。换句话说,BehaviorSubject从订阅开始就会向订阅者发送值,确保订阅者能够获取到初始值或者最新值。但是Subject对象是收到从它订阅开始之后next()传递的最新值,订阅时不会收到任何值!

误区:

        对于BehaviorSubject对象,每次调用next()方法,Observer只会收到一个新的值,不会重复收到之前的值,也就是不会累积之前的值,因为它缓存的是最新的值,并不是缓存所有值!

举例说明:

import { BehaviorSubject } from 'rxjs';const behaviorSubject = new BehaviorSubject<number>(0);// Observer在BehaviorSubject初始化时订阅
behaviorSubject.subscribe(value => console.log('Observer 1:', value));// 调用next()方法传递新值
behaviorSubject.next(1);// Observer再次订阅
behaviorSubject.subscribe(value => console.log('Observer 2:', value));// 再次调用next()方法传递新值
behaviorSubject.next(2);//运行以上代码后,我们可以看到以下输出:
Observer 1: 0
Observer 1: 1
Observer 2: 1
Observer 1: 2
Observer 2: 2

http://www.mrgr.cn/p/58302082

相关文章

一个库帮你轻松的创建漂亮的.NET控制台应用程序

前言 做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出的内容都比较的单调,假如要编写漂亮且美观的控制台输出内容或者样式可能需要花费不少的时间去编写代码和调试。今天大姚给大家分享一个.NET开源且免费的类库帮你轻松的创建漂亮、美观的.NET控制台应用…

Linux:Apache和Nginx的区别

Linux&#xff1a;Apache和Nginx的区别 图示工作过程 apache使用的是进程负责到底的工作流程&#xff0c;其特点是稳定&#xff1b;nginx使用了连接复用器这个结构&#xff0c;可以实现一个进程只负责给存储单元提出需求&#xff0c;而不需要负责到底&#xff0c;这样大大提高…

区块链技术与应用学习笔记(8-9节)——北大肖臻课程

目录 8.挖矿 对于全节点和轻节点思考问题&#xff1f; ①全节点在比特币的主要作用&#xff1f; ②挖矿时当监听到别人已经挖出区块并且延申了最长合法链此时应该立刻放弃当前区块在 本地重新组装一个指向最后这个新合法区块的候选区块&#xff0c;重新开始挖矿。节点这么做…

回溯-单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相…

c++理论篇(一) ——浅谈tcp缓存与tcp的分包与粘包

介绍 在网络通讯中,Linux系统为每一个socket创建了接收缓冲区与发送缓冲区,对于TCP协议来说,这两个缓冲区是必须的.应用程序在调用send/recv函数时,Linux内核会把数据从应用进程拷贝到socket的发送缓冲区中,应用程序在调用recv/read函数时,内核把接收缓冲区中的数据拷贝到应用…

视频通话实时换脸:支持训练面部模型 | 开源日报 No.235

iperov/DeepFaceLive Stars: 19.7k License: GPL-3.0 DeepFaceLive 是一个用于 PC 实时流媒体或视频通话的人脸换装工具。 可以使用训练好的人脸模型从网络摄像头或视频中交换面部。提供多个公共面部模型&#xff0c;包括 Keanu Reeves、Mr. Bean 等。支持自己训练面部模型以…

读天才与算法:人脑与AI的数学思维笔记12_数学的艺术

读天才与算法:人脑与AI的数学思维笔记12_数学的艺术1. 数学 1.1. 灵光乍现,从来都是厚积薄发 1.1.1. 亨利庞加莱(Henri Poincar) 1.2. 数学的起源可以追溯到人类试图理解自己所生活的环境,预测接下来会发生什么,从而使我们更加适应环境,并选择对我们有利的事物 1.2.1. 数…

【pycharm】调试模式中四个常用按钮介绍

【pycharm】调试模式中四个常用按钮介绍 在 PyCharm 的调试模式中&#xff0c;有四个常用的按钮&#xff0c;它们的功能如下&#xff1a; Step Over (F8)&#xff1a;单步执行&#xff0c;但在遇到函数调用时&#xff0c;不会进入函数内部&#xff0c;而是将整个函数作为一步执…

uniapp小程序订阅通知

服务 开通订阅服务 const tmplIds ref([tsdasdadasdfgdrtwexQHdEsjZV])//换成自己的 function confirm(){uni.requestSubscribeMessage({tmplIds: tmplIds.value,success: (res) > {// console.log(res)let auth_notice res[tmplIds.value[0]] accept ? 1 : 2 //1是接…

【Hadoop3.3.6】数据块副本放置策略及解析EditLog和FsImage

目录 一、摘要二、正文2.1 环境说明2.2 网络拓扑2.3 Hadoop副本放置策略介绍2.4 解析EditLog和Fsimage镜像文件三、小结一、摘要 通过解析存储于NameNode节点上的日志文件EditLog和镜像文件(元数据)Fsimage来反向验证HDFS的数据块副本存放策略,其目的是希望加深对Hadoop的数…

(超级详细)算法刷题Leecode15. 三数之和

题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组…

【JAVA】一文掌握Java并发编程

Java 开发中&#xff0c;并发编程属于相当重要的一个知识点&#xff0c;可以说&#xff0c;Java 的并发能力&#xff0c;是成就今日 Java 地位的因素之一。Java 的并发编程由浅入深实质上是包含 Java&#xff08;API&#xff09;层、JVM&#xff08;虚拟机&#xff09;层、内核…

全志ARM-超声波测距

超声波测距模块是用来测量距离的一种产品&#xff0c;通过发送和收超声波&#xff0c;利用时间差和声音传播速度&#xff0c; 计算出模块到前方障碍物的距离 1.测距原理&#xff1a; 给Trig端口至少10us的高电平发送声波&#xff0c;Echo信号&#xff0c;由低电平跳转到高电平…

字符串类型漏洞之updatexml函数盲注

UPDATEXML 是 MySQL 数据库中的一个函数&#xff0c;它用于对 XML 文档数据进行修改和查询。然而&#xff0c;当它被不当地使用或与恶意输入结合时&#xff0c;它可能成为 SQL 注入攻击的一部分&#xff0c;从而暴露敏感信息或导致其他安全漏洞。 在 SQL 注入攻击中&#xff0…

.NET 检测地址/主机/域名是否正常

&#x1f331;PING 地址/主机名/域名 /// <summary>/// PING/// </summary>/// <param name"ip">ip</param>/// <returns></returns>public static bool PingIp(string ip){System.Net.NetworkInformation.Ping p new System.N…

Flutter - 折叠面板

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 flutter 自定义折叠组件 支持三种类型和两种展示效果可自定义title和被折叠的内容 效果图 示例 import package:flutter/material.dart; import /jh_common/widge…

【算法刷题 | 贪心算法05】4.27(K次取反后最大化的数组和、加油站)

文章目录 8.K次取反后最大化的数组和8.1题目8.2解法&#xff1a;贪心8.2.1贪心思路8.2.2代码实现 9.加油站9.1题目9.2解法&#xff1a;贪心9.2.1贪心思路9.2.2代码实现 8.K次取反后最大化的数组和 8.1题目 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数…

Python_AI库 Matplotlib的应用简例:绘制与保存折线图

本文默认读者已具备以下技能&#xff1a; 熟悉Python基础语法&#xff0c;以自行阅读python代码块熟悉Vscode或其它编辑工具的应用 在数据可视化领域&#xff0c;Matplotlib无疑是一个强大的工具。它允许我们创建各种静态、动态、交互式的可视化图形&#xff0c;帮助我们更好…

OpenHarmony实战开发-如何实现自定义绘制 (XComponent)

XComponent组件作为一种绘制组件&#xff0c;通常用于满足开发者较为复杂的自定义绘制需求&#xff0c;例如相机预览流的显示和游戏画面的绘制。 其可通过指定其type字段来实现不同的功能&#xff0c;主要有两个“surface”和“component”字段可供选择。 对于“surface”类型…

jvm中的引用类型

Java中的引用类型 1.强引用 一个对象A被局部变量、静态变量引用了就产生了强引用。因为局部变量、静态变量都是被GC Root对象关联上的&#xff0c;所以被引用的对象A&#xff0c;就在GC Root的引用链上了。只要这一层关系存在&#xff0c;对象A就不会被垃圾回收器回收。所以只要…