首页 > 解决方案 > 如何将 throwable 传播到 Completable 的下一个链?

问题描述

我正在使用 RxJava 开发一个 Android 应用程序。

我有一些 API 调用链。

  1. 核实
  2. 消耗
val verify = Completable.error(Exception("TEST"))
            .doOnSubscribe { Log.d(TAG, "1. verify") }
            .doOnComplete{ Log.d(TAG, "1. verify - success") }
            .doOnError { Log.e(TAG, "1. verify - failed: ${it.message}") }
            .retryWhen { attempts ->
                attempts.zipWith(
                    Flowable.range(1, 3), BiFunction<Throwable, Int, Long> { t, i ->
                        if (i <= 3) {
                            1L
                        } else {
                            throw t
                        }
                    }
                ).flatMap {
                    Flowable.timer(it, TimeUnit.SECONDS)
                }
            }

// 2. consume
val consume = Single.just("SUCCESS")
    .doOnSubscribe { Log.d(TAG, "2. consume") }
    .doOnSuccess { Log.d(TAG, "2. consume - success") }
    .doOnError { Log.e(TAG, "2. consume - failed: ${it.message}", it) }

disposable.add(
    verify.andThen (consume)
        .subscribeOn(ioScheduler)
        .observeOn(uiScheduler)
        .subscribe({
            Log.d(TAG, "done")
        }, { t ->
            Log.e(TAG, "failed: ${t.message}", t)
        })
);

我例外的是...

“验证”应每 1 秒调用 3 次。

3次重试失败后,应该用Error来完成。

但就我而言,“消费”也运行了。

为什么?

如果“验证”失败,我想跳过“消费”!

我该怎么做?

标签: androidrx-javarx-java2

解决方案


这是因为您的代码没有失败。

随着Flowable.range(1, 3)您创建一个从 1 到 3 的范围,因此您的代码的 else 部分永远不会到达。

尝试一下Flowable.range(1, 4),您将看到正确的行为。


推荐阅读