Объедините две наблюдаемые и возвращаемые значения в виде списка, даже если одна наблюдаемая выдает onError - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь объединить две наблюдаемые в список объектов и просмотреть его во ViewModel.Я делаю это с помощью функции модернизации, которая возвращает Observable<TeamResponse>.Я хочу вызвать функцию дважды, но функция может выдать ошибку, если в бэкэнд-API не было найдено ни одного объекта.

Я пытался использовать это:

val suggestedTeamsList = ArrayList<TeamResponse>()

Observable.just(teamUseCase.getTeamByUserId(player1ID), teamUseCase.getTeamByUserId(player2ID))
    .flatMap {
        return@flatMap it.subscribeOn(Schedulers.computation())
    }.subscribeOn(Schedulers.computation())
        .subscribe(object: Observer<TeamResponse> {
            override fun onComplete() {
                suggestedTeams.postValue(suggestedTeamsList)
            }

            override fun onSubscribe(d: Disposable) {

            }

            override fun onNext(t: TeamResponse) {
                Log.d("TEST",t.teamName)
                suggestedTeamsList.add(t)
            }

            override fun onError(e: Throwable) {
                Log.d("TEST",e.message)
                suggestedTeams.postValue(suggestedTeamsList)
            }
        })

, и это работает, но япредпочел бы получить результат в виде списка, даже если одна функция выдает onError, в этом случае список будет иметь только 1 объект.Или, может быть, у кого-то есть идея, как правильно с этим справиться?Как может быть случай, когда методы возвращают в обеих ситуациях onError

1 Ответ

2 голосов
/ 12 апреля 2019

вы можете использовать Observable.zip. EG:

val teamResponse = TeamResponse()

fun loadPlayers() {

    val first = teamUseCase.getTeamByUserId(player1ID)
    .onErrorResumeNext { t: Throwable -> Observable.just( teamResponse ) }

   val second = teamUseCase.getTeamByUserId(player2ID)
    .onErrorResumeNext { t: Throwable -> Observable.just( teamResponse ) }

   Observable.zip(first, second, BiFunction<TeamResponse, TeamResponse, List<TeamResponse>> { t1, t2 ->
       val suggestedTeamsList = mutableListOf<TeamResponse>()
       if (t1 !== teamResponse) {
           suggestedTeamsList.add(t1)
       }
       if (t2 !== teamResponse) {
           suggestedTeamsList.add(t2)
       }
       suggestedTeamsList
    })
   .subscribeOn()
}
...