20个例子掌握RxJS

13 阅读4分钟

RxJS 实战博客系列

本系列博客基于 RxJS 实战项目,深入讲解 13 个核心场景的实现方案。

博客列表

基础操作符篇

  1. Chapter 1: expand 递归请求

    • 使用 expand 操作符实现链式递归请求
    • 自动加载多页数据
    • 分页数据的递归处理
  2. Chapter 2: forkJoin vs concatMap

    • 并行请求 vs 串行请求
    • forkJoinconcatMap 的对比
    • 不同场景下的选择策略
  3. Chapter 3: mergeMap 并发请求

    • 使用 mergeMap 实现并发请求
    • 实时处理每个请求的结果
    • 并发数控制和错误处理

竞态条件处理篇

  1. Chapter 4: switchMap 竞态条件

    • 使用 switchMap 处理请求竞态条件
    • 自动取消之前的请求
    • 快速点击场景的处理
  2. Chapter 5: switchMap 标签页切换

    • 标签页切换时的请求取消
    • 确保只显示当前标签页的数据
    • 组件销毁时的清理

性能优化篇

  1. Chapter 6: 防抖与节流

    • debounceTimethrottleTime 的应用
    • 搜索输入框的防抖处理
    • 滚动事件的节流处理
  2. Chapter 7: shareReplay Token 刷新

    • 使用 shareReplay 实现 Token 刷新的并发控制
    • 多个请求共享同一个 Token 刷新请求
    • 避免重复请求

错误处理与重试篇

  1. Chapter 8: retryWhen 失败重试
    • 使用 retryWhen 实现灵活的重试机制
    • 延迟重试和重试次数限制
    • 指数退避策略

轮询与实时通信篇

  1. Chapter 9: exhaustMap 轮询

    • 使用 exhaustMap 实现轮询机制
    • 避免请求堆积
    • 定期检查数据更新
  2. Chapter 10: 分片上传

    • 大文件分片上传
    • 断点续传功能
    • 进度显示和并发控制
  3. Chapter 11: WebSocket 消息节流

    • WebSocket 连接管理
    • 使用 throttleTime 实现消息节流
    • 自动重连机制

交互优化篇

  1. Chapter 12: 弹幕系统
    • 使用 throttleTime 实现弹幕系统
    • 点击事件的节流处理
    • 弹幕动画和自动清理

时间处理篇

  1. Chapter 13: 定时器
    • 使用 intervalscan 实现定时器
    • 开始、暂停、重置功能
    • 时间格式化和显示

核心操作符速查

操作符用途适用场景
expand递归展开链式递归请求
forkJoin并行等待等待所有请求完成
mergeMap并发映射并发执行多个请求
switchMap切换映射取消之前的请求
concatMap顺序映射按顺序执行请求
exhaustMap忽略映射避免请求堆积(轮询)
debounceTime防抖等待用户完成操作
throttleTime节流限制事件触发频率
shareReplay共享重放多个订阅者共享结果
retryWhen条件重试灵活的重试机制
interval间隔发出定时器、轮询
scan累加扫描累加计算、状态管理
startWith初始值提供初始值
takeUntil条件完成控制 Observable 完成

学习路径建议

初学者路径

  1. Chapter 1: expand 递归请求
  2. Chapter 2: forkJoin vs concatMap(理解并行和串行)
  3. Chapter 3: mergeMap 并发请求(理解并发)
  4. Chapter 6: 防抖与节流(性能优化基础)

进阶路径

  1. Chapter 4: switchMap 竞态条件(处理复杂场景)
  2. Chapter 5: switchMap 标签页切换
  3. Chapter 7: shareReplay Token 刷新(高级并发控制)
  4. Chapter 8: retryWhen 失败重试(错误处理)

实战路径

  1. Chapter 9: exhaustMap 轮询(实际应用)
  2. Chapter 10: 分片上传(复杂场景)
  3. Chapter 11: WebSocket 消息节流(实时通信)
  4. Chapter 12: 弹幕系统
  5. Chapter 13: 定时器(时间处理)

项目结构

rxjs-example/
├── front-end/          # Angular 前端项目
│   └── src/app/chapters/
│       ├── chapter1/   # expand 递归请求
│       ├── chapter2/   # forkJoin vs concatMap
│       ├── chapter3/   # mergeMap 并发请求
│       ├── chapter4/   # switchMap 竞态条件
│       ├── chapter5/   # switchMap 标签页切换
│       ├── chapter6/   # 防抖与节流
│       ├── chapter7/   # shareReplay Token 刷新
│       ├── chapter8/   # retryWhen 失败重试
│       ├── chapter9/   # exhaustMap 轮询
│       ├── chapter10/  # 分片上传
│       ├── chapter11/  # WebSocket 消息节流
│       ├── chapter12/  # 弹幕系统
│       └── chapter13/  # 定时器
├── back-end/           # Node.js 后端项目
│   └── server.js       # 提供各种 API 接口
└── blogs/              # 博客文章
    ├── README.md
    ├── chapter1-expand-递归请求.md
    ├── chapter2-forkJoin-vs-concatMap.md
    ├── chapter3-mergeMap-并发请求.md
    ├── chapter4-switchMap-竞态条件.md
    ├── chapter5-switchMap-标签页切换.md
    ├── chapter6-debounce-throttle.md
    ├── chapter7-shareReplay-token刷新.md
    ├── chapter8-retryWhen-失败重试.md
    ├── chapter9-exhaustMap-轮询.md
    ├── chapter10-分片上传.md
    ├── chapter11-WebSocket-消息节流.md
    ├── chapter12-弹幕系统.md
    └── chapter13-定时器.md

运行项目

启动后端服务

cd back-end
npm install
node server.js

后端服务将在 http://localhost:8080 启动。

启动前端项目

cd front-end
npm install
ng serve

前端项目将在 http://localhost:4200 启动。

码云地址:gitee.com/leeyamaster…

贡献

欢迎提交 Issue 和 Pull Request!

许可证

MIT License