Angular使用Subject和Observable处理异步数据流

        在Angular中常用RxJS库中的Subject和Observable处理异步数据流。

概念:

  • Observable:Observable是一个表示异步数据流的对象,它可以被订阅以获取数据并且可以被取消订阅。Observable通常用于创建和处理异步数据流,可以进行各种操作符的链式调用来处理数据流。
  • Subject:Subject是一个特殊的Observable(可转换成Observable),它允许在数据流中添加新的值,并且可以同时作为Observable和Observer。它可以用来创建可观察对象,并且可以手动推送新的值到数据流中。Subject通常用于多播数据流,可以被多个观察者订阅

相同点:

  1. 都用于处理数据流:Subject和Observable都用于表示数据流,可以被订阅以获取数据,并且可以进行各种操作符的链式调用来处理数据流。

  2. 都支持订阅和取消订阅:无论是Subject还是Observable,都支持订阅以获取数据,并且可以通过取消订阅来停止获取数据。

不同点:

  1. Subject是观察者模式的实现:Subject既是可观察对象,也是观察者。它可以手动推送新的值到数据流中,并且可以被多个观察者订阅。而Observable只是一个可观察对象,它通常用于创建和处理数据流,但不能手动推送新的值。

  2. Subject是热数据流,Observable是冷数据流:当多个观察者订阅一个Subject时,它们会共享同一个数据流,无论何时订阅,都会收到相同的数据。而Observable是冷数据流,每个观察者订阅时都会创建一个独立的数据流,它们之间是相互独立的。

  3. Subject没有延迟执行:当Subject推送新的值时,所有已经订阅它的观察者都会立即收到这个值。而Observable可以延迟执行,只有在有观察者订阅时才会开始执行。

使用场景:

        在Angular中有很多处理异步操作,比如从服务器获取数据、处理用户输入等,这些都可以用Subject或者Observe来实现。同时 Angular内置的一些服务(比如HttpClient)返回的数据通常是Observable对象,因此我们也可以使用Observable来订阅和处理这些异步数据流。

Subject:

  • 当只需要处理一个数据源时,可以使用Subject来处理,在下面的示例中,我们创建了一个Subject作为数据源,通过它的next()方法来向数据源推送数据,并通过subscribe()方法来订阅数据源的事件。
import { Subject } from 'rxjs';const dataSource = new Subject<number>();// 订阅数据源
dataSource.subscribe({next: value => console.log(`获得数据:${value}`)
});// 向数据源推送数据
dataSource.next(1);
dataSource.next(2);
dataSource.next(3);

 Observer:

  • 示例一:当需要处理多个数据源时,可以使用Observer来处理,在下面的示例中,我们创建了一个Observer用于订阅多个数据源的事件,并通过subscribe()方法来订阅数据源的事件。当数据源发生错误或者完成时,Observer也可以对其进行响应。
import { Observer } from 'rxjs';const observer: Observer<number> = {next: value => console.log(`获得数据:${value}`),error: error => console.error(`发生异常:${error}`),complete: () => console.log('操作完成')
}// 创建数据源
const dataSource1$ = of(1, 2, 3);
const dataSource2$ = new Promise(resolve => setTimeout(() => resolve(4), 3000));// 订阅数据源
dataSource1$.subscribe(observer);
dataSource2$.then(value => observer.next(value));
  • 示例二:Observable处理异步数据流完整流程,在下面的示例中,我们首先创建了一个Observable对象,它表示一个异步数据流,每隔1秒推送一个新的数字。我们使用subscribe()方法订阅这个Observable对象,以获取它推送的新值,并对这些值进行处理。最后,我们使用unsubscribe()方法取消了对Observable的订阅。
import { Observable } from 'rxjs';// 创建Observable对象,表示一个异步数据流
const observable = new Observable<number>((observer) => {let count = 0;// 模拟异步操作,每隔1秒推送一个新的值const intervalId = setInterval(() => {observer.next(count++);}, 1000);// 当Observable被取消订阅时,清除定时器return () => {clearInterval(intervalId);};
});// 订阅Observable对象,以获取数据
const subscription = observable.subscribe((data) => {console.log('Received data: ' + data);},(error) => {console.error('Error: ' + error);},() => {console.log('Completed');}
);// 取消订阅Observable对象
subscription.unsubscribe();

Subject和Observer结合使用:      

  • 在下面的示例中,我们创建了一个Subject作为数据源,同时也创建了一个Observer作为订阅者,然后通过subscribe()方法来完成订阅器的注册。这时在通过Subject的next()方法推送数据时,订阅者就可以收到数据了。
import { Subject, Observer } from 'rxjs';const subject = new Subject<number>();const observer: Observer<number> = {next: value => console.log(`获得数据:${value}`),error: error => console.error(`发生异常:${error}`),complete: () => console.log('操作完成')
}// 订阅数据源
subject.subscribe(observer);// 向数据源推送数据
subject.next(1);
subject.next(2);
subject.next(3);

转换使用:

        可使用asObservable()方法将Subject对象转换为一个Observable对象。

import { Subject, Observable } from 'rxjs';// 创建一个Subject对象
const subject = new Subject<number>();// 创建一个Observable对象,用于订阅Subject的数据流
const observable = subject.asObservable();// 订阅Observable,获取数据并处理
const subscription = observable.subscribe((data) => {console.log('Received data: ' + data);},(error) => {console.error('Error: ' + error);},() => {console.log('Completed');}
);// 推送新的值到Subject的数据流中
subject.next(1);
subject.next(2);
subject.next(3);// 取消订阅
subscription.unsubscribe();

        在上面的示例中,我们首先创建了一个Subject对象,然后使用asObservable()方法将其转换为一个Observable对象。接下来,我们订阅了这个Observable对象,以获取Subject推送的新值,并对这些值进行处理。最后,我们通过next()方法向Subject推送了一些新的值,并最终取消了订阅。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文解读:Medical Transformer论文创新点解读

这篇文章其实就是基于Axial-DeepLab: Stand-Alone Axial-Attention forPanoptic Segmentation论文上进行的一些小创新 Stand-Alone Axial-Attention forPanoptic Segmentation论文解读&#xff1a; 论文解读&#xff1a;Axial-DeepLab: Stand-Alone Axial-Attention forPanop…

【TES720D-KIT】基于国内某厂商FMQL20S400全国产化ARM开发套件(核心板+底板)

板卡概述 TES720D-KIT是专门针对我司TES720D&#xff08;基于国内某厂商FMQL20S400的全国产化ARM核心板&#xff09;的一套开发套件&#xff0c;它包含1个TES720D核心板&#xff0c;加上一个TES720D-EXT扩展底板。 FMQL20S400是国内某厂商电子研制的全可编程融合芯片&#xf…

Go 好用的Api

Go常用第三方库 命令 解释 备注 go get -u github.com/go-sql-driver/mysql Mysql驱动包 go get -u github.com/xormplus/xorm Xorm数据库框架

使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题

文章目录 一、 篇头二、 操作步骤2.1 编译AOSP AS工程文件2.2 将AOSP导入Android Studio2.3 切到Project试图2.4 等待index结束2.5 下载缺失的JDK 1.82.6 导入完成 三、 导入AS的好处3.1 本文案例演示源码编译错误AS对比同文件其余地方的调用AS错误提示依赖AS做错误修正 一、 篇…

PNG和JPG格式图片的区别

JPEG的文件格式一般有两种文件扩展名&#xff1a;.jpg和.jpeg&#xff0c;这两种扩展名的实质是相同的&#xff0c;我们可以把*.jpg的文件改名为*.jpeg&#xff0c;而对文件本身不会有任何影响 但是PNG&#xff08;Portable Network Graphics&#xff09;和JPEG&#xff08;Jo…

逆向经历回顾总结

逆向经历回顾总结 一、前言 将自己的逆向经验做个总结&#xff0c;希望新手对逆向大方向能快速了解。高手有啥不一样的经验也可以讨论讨论。 二、个人经历 本人入行逆向全因一部韩剧“幽灵”&#xff0c;里面涉及渗透、病毒分析、取证的攻防对抗&#xff0c;我觉得对新手来说…

图片转HTML-screenshot-to-code

Github地址 https://github.com/abi/screenshot-to-code 在线站 Screenshot to Code 简介 这是一个基于GPT4开发的一个工具站&#xff0c;它可以基于截图生成站点代码&#xff0c;生成速度快且准确。

C语言——const函数

一、定义常量&#xff1a;const关键字用于定义常量&#xff0c;这意味着该变量的值在程序运行期间不能被改变。 const int a 10; 二、修饰指针&#xff1a;const关键字可以修饰指针&#xff0c;表示指针指向的内容是常量&#xff0c;不能通过该指针修改所指向的内容。 i…

SpringBoot 究竟是如何跑起来的

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《SpringBoot》。&#x1f3af;&#x1f3af; &…

【MySQL 索引】InooDB 索引实现

1 索引定义 维基百科对数据库索引的定义: 数据库索引是数据库管理系统&#xff08;DBMS&#xff09;中的一个排序数据结构, 以协助快速查询和更新数据库表中的数据。 MongoDB对索引的定义: 索引是一种特殊的数据结构, 以有序和便于遍历的形式存储数据集合中特定字段或一组字段…

jmu-PTA Java答案汇总(上)

目录 Java练习第二章 7-21 统计符合条件元素的个数 7-210 sdut-array2-1-矩阵转置&#xff08;I&#xff09; 7-211 JAVA-输入输出入门 7-212 sdut-入门-三个整数和、积与平均值 7-213 jmu-java-m01-System.out.printf入门 7-214 jmu-java-m02-循环求和 7-215 编程题&am…

第22节: Vue3 可写计算

在UniApp中使用Vue3框架时&#xff0c;你可以使用可写计算属性来封装复杂的计算逻辑&#xff0c;并将结果保存到一个响应式引用对象中&#xff0c;以便在其他地方使用。 下面是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用可写计算&#xff1a; <template&g…

开源项目-

无人机跟踪移动平台并降落 基于YOLOARUCO的无人机目标检测及位置计算 ego_v2 移动物体的跟踪

Vue2面试题:说一下对vuex的理解?

五种状态&#xff1a; state: 存储公共数据 this.$store.state mutations&#xff1a;同步操作&#xff0c;改变store的数据 this.$store.commit() actions: 异步操作&#xff0c;让mutations中的方法能在异步操作中起作用 this.$store.dispatch() getters: 计算属性 th…

基于ssm服装定制系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 开发技术 ssm 基于ssm服装定制系统源码和论文751 1.1项目研究的背景 困扰管理层的许多问题当中,服装定制将是广大用户们不可忽视的一块。但是管理好服装定制又面临很多麻…

EasyV易知微助力智慧城市未来趋势发展——数字孪生城市

“智慧城市的未来趋势就是数字孪生”——《基于数字孪生的智慧城市》 城市数字化管理、智慧城市和数字孪生城市的发展是相互促进、逐步深化的过程。 城市数字化管理作为起点&#xff0c;奠定了信息化、数据化的基础&#xff1b;而智慧城市则将数字城市管理进一步升级&#xff…

RabbitMQ死信队列详解

什么是死信队列 由于特定的**原因导致 Queue 中的某些消息无法被消费&#xff0c;**这类消费异常的数据将会保存在死信队列中防止消息丢失&#xff0c;例如用户在商城下单成功并点击支付后&#xff0c;在指定时间未支付时的订单自动失效死信队列只不过是绑定在死信交换机上的队…

Springboot集成支付宝支付---完整详细步骤

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明&#xff1a;沙箱环境支持的产品&#xff0c;可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱&#xff0c;配置接口加签方式 在沙箱进行调试前…

Python (十) operator

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

第77讲:二进制方式搭建MySQL数据库5.7版本以及错误日志管理

二进制方式搭建MySQL数据库5.7版本 前面是使用的yum的方式安装的MySQL数据库,在企业生产环境中大多数都用二进制方式安装。 本次使用二进制方式搭建MySQL 5.7.36版本。 1.二进制安装MySQL5.7版本 1.1.下载MySQL5.7版本的二进制文件 [root@mysql ~]# wget https://downloads.…