【问题标题】:RxJava Chain requests & update to Observer from any requestRxJava Chain 请求并从任何请求更新到 Observer
【发布时间】:2019-06-07 17:09:37
【问题描述】:
我正在使用 RxJava 链接(使用 FlatMap)处理 3 个 API 请求。
例如:A、B、C
请求 A 给出 HttCode 错误 400。所以我希望其响应正文的数据在 UI 中显示错误消息。我在 onError() 方法中处理它并解析正文数据。但是不知道如何在不停止链的情况下将其发送给观察者。
如果我正在使用 . Observer.just(错误数据)。它将它扔到下一个 Request B FlatMap 中。
请求 B 和 C 相互依赖。请求 B 在 A 之后执行。如果请求 A 中有错误,我不想停止它们的执行。
所以我需要在 Observer 中请求 A 错误数据和请求 C 成功数据来分别显示错误消息和成功数据。
任何人都可以提出任何解决它的想法吗?
【问题讨论】:
标签:
android
android-asynctask
reactive-programming
rx-java2
rx-android
【解决方案1】:
您可以通过将 Observable 类型映射到 monad 类型来实现此目的。 IE,
将 Observable 映射到可以同时保存错误和成功状态的类型,如果在可观察流 A 中抛出错误,则使用 onErrorResumeNext 传播错误类型。
映射可观察对象 B 和 C,使其可以保存来自 A 的错误消息。在将 A 与 B 进行平面映射时,检查从 A 发出的值的类型,如果该值是错误类型,则也将错误消息传播到 C
这是我在 kotlin 中尝试过的一个示例
val obs1 = Observable.create<Float> {
throw IllegalStateException("Shit happens")
}
val obs2 = Observable.just(1)
val obs3 = Observable.just("hii")
obs1.map { Result(null, it) }.onErrorResumeNext { er: Throwable ->
Observable.just(Result<Float>(er.message, null))
}.flatMap { fltResult ->
obs2.map { Result(fltResult.error, it) }
}.flatMap { intResult ->
obs3.map { Result(intResult.error, it) }
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe({
Log.d("Data: Error", it.data + ": " + it.error)
}, {
Log.d("Error", it.message)
})
结果类存在
data class Result<T>(val error : String?,val data : T?)