连续执行不同的Completables

Execute different Completables in succession

我目前正在尝试通过 java 中的响应式扩展实现特定结果,但是我无法做到,也许你们中的某个人可以帮助我。

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

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

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

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

您原来的 andThen 链也应该有效,但您需要用 doOnError 替换 onErrorComplete,它用完成替换错误,它只调用指定的操作。或者只是 return false 来自你的 specificErrorHandlingXxx().

试试下面的方法:

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
}