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