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

Posted

技术标签:

【中文标题】如何使用 RXJava 调用的响应结果作为另一个 RXJava 函数中的 if 语句的条件?【英文标题】:How can I use the response result of an RXJava call as a condition for an if statement inside another RXJava function? 【发布时间】:2020-01-13 06:52:08 【问题描述】:

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

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

这是我的调用结构目前的样子:

 fun getAllDynamicUtterances(module: String) 

    var uttList: ArrayList<DynamicUtterance>? = ArrayList()
    rxSubs?.add(
        repository.getDynamicUtterances(module).mapres ->
            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).mapres ->
            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? 

欢迎 cmets 了解如何改进我的 getAllDynamicUtterances 功能

【问题讨论】:

订阅是异步的,而不是从doesNotReturnError方法调用返回一个值,为什么不将对象uttListutt传递给它,然后在subscribe(...中使用它们跨度> 【参考方案1】:

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

repository.getDynamicUtterances(module).flatMapres ->
            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())
                
            

【讨论】:

以上是关于如何使用 RXJava 调用的响应结果作为另一个 RXJava 函数中的 if 语句的条件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 rxJava 和改造多次调用另一个请求中的请求

使用 RxJava2 和 Retrofit2 时如何访问响应头?

RxJava入门系列四,Android中的响应式编程

Angular ngOnInit 如何将订阅结果用于另一个订阅/后端调用?

如何测试 rxjava 链接?

如何使用 RxSwift 和 Alamofire 库调用来自另一个 API 的响应的 API?