Operators 与 flattening
map 改值,filter 过滤,switchMap 取消旧内层,concatMap 保序排队,mergeMap 并发,exhaustMap 忽略重入。选择操作符就是选择并发协议。
实验:搜索使用 switchMap,提交队列使用 concatMap,重复点击用 exhaustMap,观察完成顺序。
本节专属实验:记录通知和退订
创建一个可控 Observable,分别触发 next、error、complete 和 unsubscribe,再用四种 flatten 操作符输入两个有不同延迟的任务。
ts
const source = new Observable(subscriber => {
subscriber.next(1)
const timer = setTimeout(() => subscriber.complete(), 20)
return () => clearTimeout(timer)
})预期:退订会执行 teardown;switchMap 取消旧内层,concatMap 排队,mergeMap 并行,exhaustMap 忽略忙时输入。
可运行实验
- 为流添加日志,标出订阅、next、error、complete 和 unsubscribe 的时间。
- 比较 switchMap、concatMap、mergeMap、exhaustMap 对竞态请求的行为。
- 写 marble 或等价时间线,证明取消和错误恢复符合预期。
实验记录至少包含:环境版本、输入序列、预期结果、实际结果、失败截图或日志,以及修复后再次运行的结果。
练习
- 用自己的话画出本篇概念的依赖图,并标出一个可能产生重复执行或竞态的节点。
- 写一个最小测试覆盖成功、失败、取消/卸载三条路径;测试应断言可观察结果,而不是内部实现调用次数。
- 给出一个选择当前方案而不是替代方案的理由,并写下替代方案何时更合适。