这是问题所在。我有许多异步操作,这些操作的结果汇总到一个单独的操作中,然后进一步处理。但是,并非所有操作都相等,并且错误处理基于哪个操作失败而不同。
详细地说,假设我们有操作A,B和C。如果A失败,我们需要结束处理,但是如果B或C失败,我们将照常继续处理其他操作。
当前,我们使用倒计时锁存器和大量状态管理来实现这一目标,这些状态管理需要接近一百行代码。我想将其移至基于RxJava的实现中。我的第一个想法是尝试Observable.zip
运算符,但是将所有可观察值均等对待,在这种情况下是不正确的。我的另一个想法是将调用链接起来,这行得通,但是这意味着所有操作都不会同时开始,从而导致更长的总体时间。
谁能指导我如何实现这一目标?
用途.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)
。简直!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句