如何使用 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
方法调用返回一个值,为什么不将对象uttList
和utt
传递给它,然后在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 语句的条件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxJava2 和 Retrofit2 时如何访问响应头?