错误、重试与取消
RxJS error 会结束当前 stream;catchError 放置位置决定是替换内层请求还是终止外层。retry 只用于可恢复错误,并设置上限、延迟和取消。
实验:一次网络失败后恢复,验证 stream 仍能继续;权限错误直接终止并清理。
本节专属实验:记录通知和退订
创建一个可控 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 或等价时间线,证明取消和错误恢复符合预期。
实验记录至少包含:环境版本、输入序列、预期结果、实际结果、失败截图或日志,以及修复后再次运行的结果。
练习
- 用自己的话画出本篇概念的依赖图,并标出一个可能产生重复执行或竞态的节点。
- 写一个最小测试覆盖成功、失败、取消/卸载三条路径;测试应断言可观察结果,而不是内部实现调用次数。
- 给出一个选择当前方案而不是替代方案的理由,并写下替代方案何时更合适。