Как я могу использовать результат ответа вызова RXJava в качестве условия для оператора if внутри другой функции RXJava?

Я делаю 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


person Glenncito    schedule 11.09.2019    source источник
comment
Подписки являются асинхронными, вместо того, чтобы возвращать значение из вызова метода doesNotReturnError, почему бы не передать ему объекты uttList и utt, а затем использовать их внутри subscribe({...   -  person Giddy Naya    schedule 11.09.2019


Ответы (1)


Похоже, это работа для 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())
                }
            }

person Nathan Schwermann    schedule 13.09.2019