android - 如何使用 RXJava 调用的响应结果作为另一个 RXJava 函数内 if 语句的条件?

标签 android kotlin rx-java okhttp rx-kotlin

我正在进行 2 个 RX 调用,这些调用相互嵌套且相互依赖。服务器存在问题(由于各种原因目前无法解决),该问题在第二个嵌套调用中返回错误。

在这个问题得到解决之前,我需要确保如果第二次调用返回错误,则第一次调用的结果也会被丢弃。现在,整个迭代过程在任何这些错误响应发生时都会停止,因此我的目标是跳过它们。

这是我当前的调用结构:

 fun getAllDynamicUtterances(module: String) {

    var uttList: ArrayList<DynamicUtterance>? = ArrayList()
    rxSubs?.add(
        repository.getDynamicUtterances(module).map{res ->
            res.uttSets.forEach {utt ->
                    utt.module = res.module!!
                    utt.transferInputValues()
                    utt.generateDefaultFlatTree()
                    uttList?.add(utt)
                    insertDynamicUtterance(utt)
                    repository.updateDynamicUtteranceView(utt).blockingForEach {
                        utt.assignSelectionStrings(it)
                        repository.storeDynamicUttPieces(utt.inputUttPieces)
                        utt.uttLinearisations = it.linearisations
                        updateDynamicUtterance(utt)
                    }
            }
        }.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe ({
                allDynamicUtterances?.postValue(uttList)
            },{
                Log.e("errorHandle",it.toString())
            })
    )
}

我的想法是包含一个 if 语句,该语句几乎在继续之前“查看”第二个调用,但我不确定如何进行。这是我到目前为止所想出的来表达我的想法:

fun getAllDynamicUtterances(module: String) {

    var uttList: ArrayList<DynamicUtterance>? = ArrayList()
    rxSubs?.add(
        repository.getDynamicUtterances(module).map{res ->
            res.uttSets.forEach {utt ->
                    utt.module = res.module!!
                    utt.transferInputValues()
                    utt.generateDefaultFlatTree()
                if (doesNotReturnError(utt)){ // <- add this
                    uttList?.add(utt)
                    insertDynamicUtterance(utt)
                    repository.updateDynamicUtteranceView(utt).blockingForEach {
                        utt.assignSelectionStrings(it)
                        repository.storeDynamicUttPieces(utt.inputUttPieces)
                        utt.uttLinearisations = it.linearisations
                        updateDynamicUtterance(utt)
                    }
                }
            }
        }.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe ({
                allDynamicUtterances?.postValue(uttList)
            },{
                Log.e("errorHandle",it.toString())
            })
    )
}

然后添加这个函数,或者一个执行我在任何情况下试图实现的功能的函数。

private fun doesNotReturnError(utt: DynamicUtterance): Boolean{
   rxSubs?.add(
       repository.updateDynamicUtteranceView(utt).subscribeOn(Schedulers.io())
           .observeOn(AndroidSchedulers.mainThread())
           .subscribe({
             //cant put a return here :(
           }, {
               Timber.e(it)
           })
   )
    //returning over here will return nothing wont it? 
}

我欢迎有关如何改进我的 getAllDynamicUtterances 功能的评论

最佳答案

听起来像是 flatMap 而不是 map 的工作。

repository.getDynamicUtterances(module).flatMap{res ->
            res.uttSets.forEach {utt ->
                    utt.module = res.module!!
                    utt.transferInputValues()
                    utt.generateDefaultFlatTree()
            return if (doesNotReturnError(utt)){ // <- add this
                    uttList?.add(utt)
                    insertDynamicUtterance(utt)

                    repository.updateDynamicUtteranceView(utt).doOnNext {
                        utt.assignSelectionStrings(it)
                        repository.storeDynamicUttPieces(utt.inputUttPieces)
                        utt.uttLinearisations = it.linearisations
                        updateDynamicUtterance(utt)
                    }
                } else {
                   Observable.error(utt.getError())
                }
            }

关于android - 如何使用 RXJava 调用的响应结果作为另一个 RXJava 函数内 if 语句的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57889004/

相关文章:

android - react 原生 Android Gradle 失败

java - RxJava Observable 出错时继续并获取状态

android - Retrofit/Rxjava 和基于 session 的服务

android - firebase.database.DatabaseException : Failed to convert value of type java. lang.Long 到字符串

android - Android 服务如何更新启动它的 Activity 的 UI?

android - 使用 MediatorLiveData 将多个 LiveData 值合并为一个

android - LaunchedEffect 触发甚至认为合成应该已经结束并且键已更改

java - LiveData 对象可以在 XML 中观察吗?

android - 如何在最后一个订阅者退订后延迟拆除共享的、无限的 Observables

android - 可访问性图像上缺少 contentDescription 属性如何删除此警告?