用途:帮助编写、重构、审查或调试使用 RxJS 的代码,使其符合惯用写法、易于组合且避开常见陷阱。核心思想是让逻辑留在 observable 链中:每当想用 .subscribe() 时,先考虑能否用 .pipe() 内的转换来表达。
主要能力与用法:
- 避免过早 subscribe:不要在回调里做命令式状态跟踪或嵌套订阅,改用 switchMap 等链内组合;加载/错误状态用 startWith 在链中派生。
- 避免巨型 new Observable():构造函数应短小专注,只作为非响应式来源到响应式世界的桥梁;基于 Promise 的来源用 defer(() => promise),重试、错误处理、来源合并在操作符链中完成。
- 选择扁平化操作符:switchMap 用于只关心最新值的场景(输入、搜索联想、路由变更);mergeMap 用于并发且结果都需要的独立操作;concatMap 用于顺序不可丢的场景;exhaustMap 用于防止重复提交。多数 UI/请求默认 switchMap。
- 错误处理:希望外层流继续时,把 catchError 放在内层 observable 上;重试也应针对内层操作而非整个外层流。
- 避免内存泄漏:尽量不订阅;使用会自然完成的 first()、take(n)、takeUntil(destroy$);takeUntil 必须是管道最后一个操作符;多个独立流可合并为一次订阅。
- 热冷流:冷流(new Observable、of、HTTP 请求)每个订阅者各自执行;热流(Subject、fromEvent)共享执行。共享冷流用 shareReplay({ bufferSize: 1, refCount: true }),务必加 refCount: true。
- 响应式派生状态:用 combineLatest 或 scan 代替可变变量;combineLatest 在任意输入发出时发出,withLatestFrom 仅在源发出时发出,startWith 提供初始值以解锁流。
- Subject 慎用:适合事件总线和桥接回调,不适合作为通用状态容器。
- 自定义操作符:签名即 (source: Observable<A>) => Observable<B>,可用 OperatorFunction<In, Out> 提取重复管道。
- 副作用放入 tap 而非 subscribe:subscribe 最好无参数;tap 还接受带 subscribe、next、error、complete、unsubscribe、finalize 生命周期钩子的观察者对象,便于调试。
- 避免不必要的 Promise 转换:firstValueFrom/lastValueFrom 适合一次性互操作,若在 subscribe 回调中用它规避响应式写法则属坏味道。
适用场景:编写、重构、审查或调试使用 RxJS 的前端/异步代码。
限制:资料未提供具体版本要求、安装命令、完整 API 参考或收费信息;详细示例需查阅其中提到的 references 参考文件。