news 2026/6/25 15:42:11

rxjs基本语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 14:36:54

Altium Designer内PCB走线电流关系图解说明

走线宽度怎么定&#xff1f;别再靠猜了——Altium Designer中PCB载流能力的科学设计法你有没有遇到过这种情况&#xff1a;板子打回来一上电&#xff0c;某段电源走线“滋”地冒烟&#xff0c;芯片还没工作就烧了&#xff1b;或者机器跑着跑着突然保护关机&#xff0c;拆开一看…

作者头像 李华
网站建设 2026/6/15 18:13:05

诗歌天地:我该用多大的比例尺,来绘制自己这一生的地图?

11. 【进化之镜 无目的的宏伟设计】没有蓝图&#xff0c;只有试错。生命用亿万年的死亡作为学费&#xff0c;才学会如何更好地生存。这过程盲目、残酷&#xff0c;且效率低下&#xff0c;却最终雕刻出了羚羊的跳跃、鹰隼的视觉与人类追问“为什么”的大脑皮层。12. 【相对之镜…

作者头像 李华
网站建设 2026/6/18 8:28:27

IL-6/IL-6R信号通路与细胞因子风暴:病理机制与靶向干预

一、细胞因子风暴&#xff1a;免疫平衡失调的病理核心 细胞因子风暴是一种严重的全身性免疫失调综合征。其本质在于&#xff0c;当病原体感染等强烈刺激发生时&#xff0c;机体免疫系统被过度激活&#xff0c;导致促炎与抗炎反应之间的精细平衡被破坏。这种失调引发免疫细胞异…

作者头像 李华
网站建设 2026/6/25 1:44:17

告别“调参侠“!大模型六步理论框架,小白也能成为AI大神

大语言模型&#xff08;Large Language Models, LLMs&#xff09;的迅速崛起引发了人工智能领域的深远范式转移&#xff0c;并在工程层面取得了巨大成功&#xff0c;对现代社会产生着日益增长的影响。然而&#xff0c;当前领域仍存在一个关键悖论&#xff1a;尽管 LLMs 在经验上…

作者头像 李华
网站建设 2026/6/24 11:13:53

HBuilderX制作网页:零基础构建移动H5页面

从零开始用 HBuilderX 做一个移动网页&#xff1a;新手也能上手的实战指南 你有没有过这样的想法——想做个活动页面、做个产品介绍页&#xff0c;或者只是给自己的小项目搭个展示窗口&#xff1f;但一想到要学 HTML、CSS、JavaScript 就头大&#xff1f;别急&#xff0c;今天…

作者头像 李华
网站建设 2026/6/19 11:17:47

GEO战略新纪元:2026年,执行之外更需顶层咨询 从算法执行到战略规划——AI搜索时代的企业生存法则

GEO战略新纪元&#xff1a;2026年&#xff0c;执行之外更需顶层咨询从算法执行到战略规划——AI搜索时代的企业生存法则当AI成为用户获取信息的首要入口&#xff0c;GEO已不再是单纯的技术优化&#xff0c;而是决定企业未来十年生死存亡的核心战略。本文深度解析2026年GEO战略咨…

作者头像 李华