如何将RXJava调用的响应结果用作另一个RXJava函数内部的if语句的条件?

时间:2019-09-11 12:19:02

标签: 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 功能

1 个答案:

答案 0 :(得分:1)

听起来像flatMap而非地图的工作。

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())
                }
            }