Я делаю 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
doesNotReturnError
, почему бы не передать ему объектыuttList
иutt
, а затем использовать их внутриsubscribe({...
- person Giddy Naya   schedule 11.09.2019