android - 如何将 throwable 传播到 Completable 的下一个链?
问题描述
我正在使用 RxJava 开发一个 Android 应用程序。
我有一些 API 调用链。
- 核实
- 消耗
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来完成。
但就我而言,“消费”也运行了。
为什么?
如果“验证”失败,我想跳过“消费”!
我该怎么做?
解决方案
这是因为您的代码没有失败。
随着Flowable.range(1, 3)
您创建一个从 1 到 3 的范围,因此您的代码的 else 部分永远不会到达。
尝试一下Flowable.range(1, 4)
,您将看到正确的行为。
推荐阅读
- node.js - nodejs 将对象导出到特定程序
- powershell - powershell 调用命令不处理 try-cache 块
- javascript - Ant Design Upload 获取文件内容
- javascript - Leaflet - 使用平铺层时如何保持原始坐标系有效?
- android-livedata - 实时数据数学运算
- python - 在 Windows 上安装 Auto-Sklearn 会出错
- java - 用 mockito 模拟 Unirest
- javascript - 如何在javascript中找到具有属性的元素并更改属性值?
- uppaal - 你可以在 uppaal 中 decalare 一个 json 数组吗?
- sql - 我想将一条记录与 SQL 中另一个表中的记录子串进行比较