问题
假设有一个 Http 请求 observable 出错了,我们可以重试它。但我也希望 UI 通知用户该资源无法加载。什么是最好的架构?
目标 Observable 的预期行为
- 可重试。
- 长跑。未完成或出错。
- 共享。多个订阅者时不会产生不必要的请求。
- 按需加载。未订阅时不会产生不必要的请求。
- 将错误通知 UI。
(3和4可以通过实现shareReplay({bufferSize: 1, refCount: true})
)
我的尝试
我认为最好在继续重试源的同时将错误消息传递给下游观察者。它会对架构造成最小的更改。但是我没有看到可以用 Rxjs 做到这一点的方法,因为
retry()
总是拦截错误。如果您实现错误,则retry()
不会重试。如果不是,则不会有错误传播到下游。catchError()
不重新抛出将始终完成流。
虽然让 UI 观察者可以满足这个需求,但我认为让 UI 承担这个责任是危险的tap(,,onError)
。retry()
多个 UI 观察者意味着很多重复的重试。