rxjs基本语法

RxJS (Reactive Extensions for JavaScript) 是 Angular 中处理异步编程的核心库。 它通过使用Observable(可观察对象)序列来编写异步和基于回调的代码。


一、 核心概念
在 RxJS 中,一切基于数据流。

  • Observable (被观察者):数据的源头,发出数据。
  • Observer (观察者):数据的消费者,接收数据。
  • Subscription (订阅):连接 Observable 和 Observer 的桥梁。注意:必须取消订阅,否则会内存泄漏。
  • Operators (操作符):纯函数,用来处理、转换数据流(如 map, filter)。
  • Subject (主题):既是 Observable 又是 Observer,可以多播数据(常用于组件通信)。

二、 基础写法
1. 创建 Observable 和 订阅

import { Observable } from 'rxjs'; // 1. 创建 Observable const observable$ = new Observable(subscriber => { subscriber.next(1); // 发出数据 subscriber.next(2); subscriber.next(3); subscriber.complete(); // 结束 // subscriber.error('出错了'); // 抛出异常 }); // 2. 订阅 const subscription = observable$.subscribe({ next: (x) => console.log('收到数据:', x), error: (err) => console.error('错误:', err), complete: () => console.log('流结束') }); // 3. 取消订阅 (非常重要) subscription.unsubscribe();

2. 简写订阅 (只关心 next)

observable$.subscribe(data => console.log(data));

三、 常用创建操作符
用于生成数据流。

import { of, from, interval, fromEvent, throwError } from 'rxjs'; // 1. of: 依次发出参数 of(1, 2, 3).subscribe(console.log); // 输出: 1, 2, 3 // 2. from: 将数组/Promise 转为 Observable from([10, 20, 30]).subscribe(console.log); // 输出: 10, 20, 30 // 3. interval: 周期性发出数字 (每1秒发一个) interval(1000).subscribe(n => console.log(n)); // 0, 1, 2... // 4. fromEvent: 监听 DOM 事件 fromEvent(document.querySelector('button')!, 'click') .subscribe(() => console.log('按钮被点击')); // 5. throwError: 创建一个只报错的流 // throwError(() => new Error('哎呀出错了')).subscribe();

四、 常用转换操作符
这是 RxJS 最强大的部分,管道语法是 Angular 18+ 的标准写法。

import { map, filter, pluck } from 'rxjs/operators'; of(1, 2, 3, 4, 5).pipe( // 1. map: 转换数据 (类似数组的 map) map(x => x * 10), // 2. filter: 过滤数据 (只有 true 才会通过) filter(x => x > 20) ).subscribe(console.log); // 输出: 30, 40, 50 // 3. pluck: 提取对象属性 (已废弃,推荐用 map) // 旧写法: source$.pipe(pluck('user', 'name')) // 新写法: interface User { name: string; age: number; } const user$: Observable<User> = of({ name: 'Tom', age: 18 }); user$.pipe(map(user => user.name)).subscribe(console.log);

五、 工具操作符 (面试高频)
用于处理流的逻辑,如限流、防抖、错误处理。

import { delay, tap, catchError, takeUntil, debounceTime } from 'rxjs/operators'; import { of, Subject, throwError } from 'rxjs'; // 1. tap: 副作用操作 (不修改数据,通常用于打印日志、存 LocalStorage) of('Hello').pipe( tap(val => console.log('处理前:', val)), delay(1000) // 延迟1秒发射 ).subscribe(val => console.log('处理后:', val)); // 2. catchError: 错误捕获 (让流不中断) throwError(() => new Error('网络错误')).pipe( catchError(err => { console.error(err); // 捕获错误后,返回一个新的 Observable 给下游,防止程序崩溃 return of('默认数据'); }) ).subscribe(console.log); // 输出: 默认数据 // 3. debounceTime: 防抖 (用户停止输入 300ms 后才发送请求) fromEvent(document.querySelector('input')!, 'input').pipe( debounceTime(300) ).subscribe((event: any) => console.log(event.target.value)); // 4. takeUntil: 立即取消订阅 (在 Angular 组件销毁时最常用) const destroy$ = new Subject<void>(); interval(1000).pipe( takeUntil(destroy$) // 当 destroy$ 发出值时,上面的流自动停止 ).subscribe(console.log); // 模拟组件销毁 setTimeout(() => { destroy$.next(); // 停止上面的 interval destroy$.complete(); }, 5000);

六、 高阶操作符 (处理嵌套流)
当一个 Observable 发出的数据还是一个 Observable 时使用。

import { mergeMap, switchMap, concatMap, exhaustMap } from 'rxjs/operators'; // 场景:点击按钮 -> 发送 HTTP 请求 // 假设 click$ 是点击事件流, getData(id) 返回 Observable // 1. mergeMap (并行): 点击一次发一次请求,不管上一个有没有完成。 // 适用:并发上传,互不干扰。 click$.pipe( mergeMap(() => this.http.get('/api/data')) ).subscribe(); // 2. switchMap (切换): **面试必考**。如果有新请求,取消旧请求。 // 适用:搜索框输入。 searchInput$.pipe( switchMap(keyword => this.http.search(keyword)) ).subscribe(); // 3. concatMap (串行): 等前一个请求完成,再发下一个。 // 适用:必须按顺序执行的任务。 // 4. exhaustMap (排他): 如果有请求正在进行,忽略新的点击。 // 适用:防止重复提交表单。 submitBtn$.pipe( exhaustMap(() => this.http.submit()) ).subscribe();

七、 Subject (多播)
普通的 Observable 是单播的;Subject 可以让多个订阅者共享同一个数据源。

import { Subject, BehaviorSubject, ReplaySubject } from 'rxjs'; // 1. Subject: 只有订阅后发出的数据才会收到。 const subject = new Subject<number>(); subject.subscribe(n => console.log('A:', n)); subject.next(1); // A 收到 1 subject.subscribe(n => console.log('B:', n)); subject.next(2); // A 收到 2, B 收到 2 (B 错过了 1) // 2. BehaviorSubject: 必须有初始值,新订阅者会立即收到**最新**的值。 const bs = new BehaviorSubject<number>(0); // 初始值 0 bs.subscribe(n => console.log('C:', n)); // C 立即收到 0 bs.next(100); // 3. ReplaySubject: 可以缓存最近的 N 个值,新订阅者会收到缓存的历史记录。 const rs = new ReplaySubject(2); // 缓存最近 2 个 rs.next(1); rs.next(2); rs.next(3); rs.subscribe(n => console.log('D:', n)); // D 收到 2 和 3

八、 Angular 实战:AsyncPipe (语法糖)
在 Angular 中,你甚至不需要手动调用.subscribe()

// 组件 TS export class MyComponent { // 自动处理订阅、取消订阅、变化检测 data$ = of([{ name: 'Tom' }, { name: 'Jerry' }]); } // 组件 HTML <div *ngFor="let item of data$ | async"> {{ item.name }} </div>

注意:如果你需要拿到数据后在 TS 逻辑里做复杂处理,还是需要手动 subscribe 并配合takeUntil使用。
总结速查表

类别操作符作用
创建of, from, interval造数据
转换map, filter改数据
工具tap, delay, debounceTime辅助/拦截
组合switchMap, mergeMap处理嵌套流 (HTTP)
生命周期takeUntil, first, take管理订阅
错误catchError, retry异常处理
多播Subject, BehaviorSubject跨组件通信



原文: https://juejin.cn/post/75969919

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

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

相关文章

专访智脑时代卢向彤:当 AI 接管钱包,企业如何抢占智能体经济的“核心生态位”?

“未来的消费者可能不再是‘人’&#xff0c;而是代表人的‘AI Agent’。” 深圳智脑时代创始人卢向彤认为&#xff0c;商业世界正处于从“注意力经济”向“意图经济”跃迁的前夜。企业若不能让自己的服务被 AI 读懂并调用&#xff0c;将在新的商业版图中彻底隐形。设想这样一个…

前端向架构突围系列 - 工程化(五):企业级脚手架的设计与落地

写在前面 很多团队都有一个“规范文档”&#xff0c;它通常静静地躺在 Wiki 的角落里&#xff0c;只有新员工入职的第一天会被打开&#xff0c;然后迅速被遗忘。 依靠文档约束人性的规范&#xff0c;注定是失败的。 在架构师的眼里&#xff0c;规范不应该是一个文档&#xff0c…

金属款气象仪:支持数据实时读取

金属款气象仪支持数据实时读取&#xff0c;主要通过以下方式实现&#xff1a;高集成度结构与数字量通讯接口&#xff1a;金属款气象仪采用高集成度设计&#xff0c;将风速、风向、温度、湿度、大气压力等关键气象参数的传感器集成于一个紧凑的金属外壳内。这种设计不仅简化了安…

一条传统产线的智能化转型项目管理实录

摘要&#xff1a; 本文以汽车零部件行业的“发动机缸体加工生产线自动化升级项目”为研究对象&#xff0c;结合笔者亲历的项目管理全流程&#xff0c;系统阐述PMP项目管理知识体系在行业项目中的实操落地过程。项目针对传统生产线效率低、良品率波动大、人工成本高的痛点&#…

告别字段注入:为什么你应该在 Spring 中使用构造器注入

在日常的 Spring Boot 开发中&#xff0c;你是否经常这样写代码&#xff1f;RestController public class UserController { Autowired private UserService userService; } 看起来简洁、直观&#xff0c;IDE 也能自动补全。但细心的同学可能已经注意到&#xff1a;IntelliJ ID…

如何将联系人从 Android 传输到 PC

失去联系人可能会带来很大的不便。无论您是要升级手机、备份数据&#xff0c;还是只是需要访问计算机上的联系人列表&#xff0c;了解如何将联系人从 Android 传输到 PC 总是很有用的。按照本指南&#xff0c;获得 6 个实用方法&#xff0c;然后轻松转移您的联系人。第 1 部分&…

超500万台、破百亿元!2025年我国3D打印机出口成绩亮眼

资源库 / 1月20日消息&#xff0c;据海关总署最新数据显示&#xff0c;2025年12月我国3D打印机出口量达到57万台&#xff0c;同比增长81.2%&#xff0c;出口总额达14.89亿元&#xff0c;同比增长117.9%。2025年全年&#xff0c;我国累计出口3D打印机503万台&#xff0c;同比增长…

如何将数据从 iPad 无缝传输到 iPad综合教程

当您购买新iPad时&#xff0c;您可能想将旧iPad上的数据转移到新iPad上&#xff0c;例如照片、视频、音乐、应用程序等。那么&#xff0c;您知道如何将数据从iPad转移到新iPad吗&#xff1f;事实上&#xff0c;这很简单。阅读今天的文章&#xff0c;您将逐步了解如何使用 5 种可…

基于SpringCloud + ElasticSearch + Redis + RabbitMQ 构建高性能电商搜索和个性化推荐系统

在电商平台的核心链路中&#xff0c;搜索与推荐直接决定了用户体验与转化效率。传统数据库搜索面临精准度低、响应缓慢、推荐同质化等问题&#xff0c;而消息队列的引入能有效解决数据实时同步、系统解耦等关键诉求。本文将基于 SpringCloud ElasticSearch Redis RabbitMQ 技…

金小厨切肉器:6年打磨的 “切肉神器”,解决做饭人三大难题

对多数家庭烹饪者而言&#xff0c;切肉始终是厨房操作中的 “老大难”—— 新手常因刀工不佳切出厚薄不均的肉片&#xff0c;老手也难免因长时间操作感到手腕酸痛。深耕厨房工具领域6年的金小厨品牌&#xff0c;精准捕捉这一用户痛点&#xff0c;金小厨始终以实用创新为核心&am…

贵金属强势破历史新高,2026 年涨势能否一路延续?

降息周期下的贵金属行情推演 2026年伊始&#xff0c;贵金属市场以“强势破局”姿态开启全年行情&#xff0c;伦敦金现价格突破4700美元/盎司&#xff0c;沪金、沪银期货合约同步创下历史新高&#xff0c;市场对涨势延续性的讨论愈发热烈。但回顾历史&#xff0c;贵金属暴涨后往…

Docker compose更新容器版本踩坑

执行docker compose up -d之前一定看看卷挂载,如果没删除干净的话且文件与容器核心程序重名,就会导致docker把最新的容器拉下来了,然后挂载卷中的文件夹把容器中的同名文件夹覆盖,于是导致容器没变化一样的结果

Pytest自动化测试实战之执行参数

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 上一篇介绍了如何运行pytest代码&#xff0c;以及用例的一些执行规则&#xff0c;执行用例发现我们中间print输出的内容&#xff0c;结果没有给我们展示出来&…

什么是活动目录Active Directory安全?

活动目录&#xff08;AD&#xff09;是大多数企业IT环境的核心支柱&#xff0c;负责管理整个组织网络中的用户身份、认证与访问控制。随着网络威胁不断演变且愈发复杂&#xff0c;活动目录安全已成为全球IT管理员和网络安全专业人员的核心要务。本指南将全面探讨活动目录安全的…

为什么现在招聘C++程序员这么难?

有HR说&#xff1a;“招聘条件已经降到很低了&#xff0c;薪资也还不错&#xff0c;就是没人。”主题&#xff1a;为什么现在招聘C程序员这么难&#xff1f;https://www.zhihu.com/question/491876804【回答1】要不是我正在找工作&#xff0c;我就信你了&#xff0c;现实情况是…

博客园借口测试Test123134

c博客园借口测试Test博客园借口测试Test博客园借口测试Test博客园借口测试Test博客园借口测试Test作者: 咕咚!出处:https://www.cnblogs.com/linga/关于作者:专注虚拟化,运维开发,RPA,Rust,Go,Python!本文版…

前英伟达工程师撰写,被称为“目前最好的 AI 工程书”,它凭什么被一线大牛反复推荐?

最近读完了一本关于 AI Engineering 的书&#xff0c;说实话&#xff0c;这是我开年读过最值得推荐的 AI 相关书籍之一。如果你和我一样&#xff0c;不是 AI 研究员&#xff0c;也不是机器学习专家&#xff0c;但每天都在和 LLM、Copilot、ChatGPT、RAG、Prompt 打交道&#xf…

Linux基础day03

Linux基础day03linux基础学习 (3)认知root用户root用户 无论是Windows,MacOS还是Linux均采用多用户的管理模式进行权限管理 在Linux系统中,拥有最大权限的账户名字为root 前期我们使用的一直是普通用户kali root用户…

医药企业如何用日志分析工具抓住盗取数据黑手

上周参与的一起商业秘密案件让我脊背发凉&#xff1a;某RNA创新药企的高通量筛选QC标准被团队负责人陈某外泄给竞争对手&#xff0c;这款支撑企业估值百亿的核心技术&#xff0c;差点因为“日志查不清操作轨迹”无法定罪。直到调取全系统日志交叉验证才锁定证据——而这类“日志…

2026年酒店前台迎宾接待机器人选购指南与主流产品推荐

截至2026年初,酒店迎宾机器人已从最初的“噱头”转变为行业提升服务效率的标配,市场反馈显示其在降低前台重复工作量与提升住客满意度方面表现优异。对于致力于数字化转型的酒店管理者而言,选择一款成熟、稳定且能深…