【问题标题】: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?)
    

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2020-03-28
      • 2018-05-31
      • 1970-01-01
      • 2021-09-02
      • 2015-08-12
      相关资源
      最近更新 更多