RxJava Chain请求并从任何请求更新到Observer

时间:2019-06-07 17:09:37

标签: android android-asynctask reactive-programming rx-java2 rx-android

我有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数据。

有人可以提出任何解决方案的建议吗?

1 个答案:

答案 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?)