连续执行不同的Completables

时间:2017-01-20 10:32:25

标签: rx-java reactivex

我目前正在尝试使用java中的反应式扩展来实现特定结果,但是我无法这样做,也许有人可以帮助我。

firstCompletable
  .onErrorComplete(t -> specificErrorHandlingOne())
  .andThen(secondCompletable())
  .onErrorComplete(t -> specificErrorHandlingTwo())
  .andThen(thirdCompletable())
  .onErrorComplete(t -> specificErrorHandlingThree())
  .andThen(fourthCompletable())
  .onErrorComplete(t -> specificErrorHandlingFour())
  .subscribe(viewCallback::showSuccess)

但是,当例如第二个完成时出现错误时,正在执行特定的错误处理,但是仍然正在调度其他的Completables。如果其中一个Completables失败,我希望整个Completables链停止执行。我该怎么做?

我已经尝试过使用doOnError,但这只是在抛出特定错误的堆栈跟踪上结束。

2 个答案:

答案 0 :(得分:5)

Completable.concat(
    completable1.doOnError(e -> {...}),
    completable2.doOnError(e -> {...}),
    completable3.doOnError(e -> {...}),
    completable4.doOnError(e -> {...})
).subscribe(action, errorConsumer);
  • 将按指定的顺序订阅Completables
  • 完成所有后,将调用
  • action
  • 您可以为每个错误处理程序指定(这是可选的)
  • 任何错误都会破坏管道并传播给订阅者(errorConsumer

您的原始andThen链也可以使用,但您需要将onErrorComplete替换为doOnError替换完成错误,false只调用指定的操作。或者只是从specificErrorHandlingXxx()返回<script type="text/babel"> import $ from 'jquery' require('x-editable') </script>

答案 1 :(得分:1)

尝试以下方法:

public static void main(String[] args) {
    System.out.println("start");
    Completable c1 = Completable.fromAction(() -> printAndWait(1, 1));
    Completable c2 = Completable.fromAction(() -> printAndWait(2, 2));
    Completable c3 = Completable.fromObservable(Observable.timer(3, TimeUnit.SECONDS).concatWith(Observable.error(new RuntimeException())));
    Completable c4 = Completable.fromAction(() -> printAndWait(4, 2));

    c1.concatWith(c2).concatWith(c3).concatWith(c4).subscribe(e -> e.printStackTrace(), () -> System.out.println("done"));

    printAndWait(10, 10);//dont exit till program is completely executed

}

private static void printAndWait(int i, int j) {
    System.out.println(i);
    Observable.timer(j, TimeUnit.SECONDS).toBlocking().subscribe();//just add delay
}