我有3个API请求,正在使用RxJava Chaining(使用FlatMap)进行处理。
例如:A,B,C
请求A给出了HttCode错误400。所以我希望其响应主体的数据在UI中显示错误消息。我在onError()方法中处理了它并解析了正文数据。但是不知道如何在不停止链接的情况下将其发送给Observer。 如果我正在使用。 Observer.just(ErrorData)。它将它扔到下一个请求B FlatMap中。
请求B和C相互依赖。请求B在A之后执行。如果请求A中有错误,我不想停止执行。
所以我需要在Observer中请求Request A Error数据和Request C Success数据以分别显示Error message和Success数据。
有人可以提出任何解决方案的建议吗?
答案 0 :(得分:1)
您可以通过将Observable类型映射为monad类型来实现。即 将Observable映射到可以同时包含错误和成功状态的类型,如果在可观察流A中引发错误,则使用onErrorResumeNext传播错误类型。
映射可观察对象B和C,使其可以保存来自A的错误消息。同时将A与B进行平面映射,检查从A发出的值的类型,如果该值是错误类型,也将错误消息也传播到C中
这是我在科特林尝试过的一个例子
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?)