用途
本技能用于在 Angular 应用中处理异步操作,围绕 Observables、操作符(operators)和 Subjects 展开,帮助构建响应式编程模式,管理数据流、异步任务与订阅生命周期。
主要能力
可观察对象的创建
提供 of、from、interval、fromEvent 以及自定义 Observable 的创建示例,并展示 HttpClient 返回 Observable 的常见服务写法(get、post、put、delete)。
常用操作符
- 转换类:map、pluck(含已弃用说明)、switchMap、mergeMap、concatMap。
- 过滤类:filter、take、takeUntil、takeWhile、distinctUntilChanged。
- 组合类:combineLatest、merge、concat、forkJoin、zip、startWith。
- 工具类:tap、delay、debounceTime、throttleTime、distinctUntilChanged。
错误处理
使用 catchError 返回兜底值、空 Observable 或重新抛出错误,并可按错误类型(如 404)分支处理;使用 retry、retryWhen 实现简单重试、带延迟重试与指数退避。
订阅管理
- takeUntilDestroyed()(推荐):无需 ngOnDestroy,也无需手动 Subject。
- DestroyRef:用于构造函数之外的命令式订阅(如用户操作触发)。
- AsyncPipe:模板中自动管理订阅,无需手动取消。
Subject 类型
Subject(多播)、BehaviorSubject(持有当前值,常用于状态管理)、ReplaySubject(缓冲数值)、AsyncSubject(完成时发出最后一个值),并给出状态服务模式示例。
热与冷可观察对象
说明冷 Observable(单播,每次订阅重新执行)与热 Observable(多播)的差异,并提供 share、shareReplay 实现共享与缓存(例如避免重复 HTTP 请求)。
服务中的模式
- 带状态的数据服务:使用 signal、computed 管理同步状态,Observable 处理异步 HTTP,可用 toSignal() 转换后用于模板。
- 带防抖的搜索服务:组合 debounceTime、distinctUntilChanged、switchMap。
测试
涵盖 HttpClientTestingModule 与 HttpTestingController 测试 Observable,以及使用 TestScheduler 的大理石图(marble diagram)测试。
使用方式
资料以 TypeScript 代码片段呈现各项模式,使用时按对应示例引入 Angular 与 RxJS 的模块、操作符并在服务或组件中组合使用。示例涵盖 inject()、@if/@for 控制流等现代 Angular 写法。
适用场景
- 复杂异步数据流
- 实时更新与流式数据
- 高效的 HTTP 请求管理
- 带防抖的表单输入处理
- 基于 Observable 的状态管理
- 错误处理与重试逻辑
- 组合多个异步来源
- 内存安全的订阅管理
限制与注意事项
资料中列出常见错误:未取消订阅(内存泄漏)、嵌套订阅(回调地狱)、不使用操作符(命令式而非声明式)、在服务中直接订阅(应返回 Observable)。同时给出最佳实践建议,如使用 takeUntilDestroyed()、用 signals 管理状态、模板中使用 async pipe、用 shareReplay 缓存、用 debounceTime 减少 API 调用、用 switchMap 取消旧请求、始终用 catchError 处理错误、用大理石图正确测试。
关于许可、收费、版本兼容范围等具体信息,资料中暂未提供。