这就是问题所在。我有许多异步操作,其结果聚合成一个进一步处理的结果。但是,并非所有操作都相同,并且错误处理因操作失败而不同。
详细说明,我们说我们有操作A,B和C.如果A失败,我们需要结束处理,但如果B或C失败,我们会继续正常处理其他操作。
目前,我们使用倒计时锁存器和许多状态管理来实现这一目标,这需要接近一百行代码。我想将其转移到基于RxJava的实现。我的第一个想法是尝试Observable.zip
运算符,但是将所有可观察对象视为等于,在这种情况下不是这样。我的另一个想法是将通话链接起来,但是这意味着所有操作都不会同时启动,从而导致更长的总时间。
任何人都可以指导我如何实现这个目标吗?
答案 0 :(得分:3)
使用.onErrorResumeNext
:
Observable<T> a, b, c;
Observable.zip(
a,
b.onErrorResumeNext(t -> Observable.just(null)),
c.onErrorResumeNext(t -> Observable.just(null)),
(x, y, z) -> <your aggregation>)
...
使用null
表示错误的可观察对象取决于您。您也可以使用Optional
:
Observable.zip(
a,
b.map(x -> Optional.of(x))
.onErrorResumeNext(t -> Observable.just(Optional.empty())),
c.map(x -> Optional.of(x))
.onErrorResumeNext(t -> Observable.just(Optional.empty())),
(x, y, z) -> <your aggregation>)
如果b
和c
与外部服务电话相对应,您可能还想忽略它们,如果将b
替换为b.timeout(5, TimeUnit.SECONDS)
,则需要花费太长时间。简洁呃!