优先级为

时间:2016-07-25 19:40:14

标签: rx-java reactive-programming

这就是问题所在。我有许多异步操作,其结果聚合成一个进一步处理的结果。但是,并非所有操作都相同,并且错误处理因操作失败而不同。

详细说明,我们说我们有操作A,B和C.如果A失败,我们需要结束处理,但如果B或C失败,我们会继续正常处理其他操作。

目前,我们使用倒计时锁存器和许多状态管理来实现这一目标,这需要接近一百行代码。我想将其转移到基于RxJava的实现。我的第一个想法是尝试Observable.zip运算符,但是将所有可观察对象视为等于,在这种情况下不是这样。我的另一个想法是将通话链接起来,但是这意味着所有操作都不会同时启动,从而导致更长的总时间。

任何人都可以指导我如何实现这个目标吗?

1 个答案:

答案 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>)

如果bc与外部服务电话相对应,您可能还想忽略它们,如果将b替换为b.timeout(5, TimeUnit.SECONDS),则需要花费太长时间。简洁呃!