Как объединить ошибку agerdelayerror в RxJava2

#rx-java2 #rx-kotlin2

#rx-java2 #rx-kotlin2

Вопрос:

Как реализовать Observable.concatEagerDelayError или эквивалент в RxJava2 / RxKotlin2?

Существует :

  • Observable.concatEager
  • Наблюдаемый.concatDelayError

Но не :

  • Наблюдаемый.Ошибка concatEagerDelayError

Что у меня есть :

 fun getAll(): Observable<List<User>> = Observable.concatArrayDelayError(
    // from db
    userDAO
        .selectAll()
        .subscribeOn(ioScheduler),
    // from api
    userAPI
        .getAll()
        .doOnNext { lstUser -> Completable.concatArray(
            userDAO.deleteAll().subscribeOn(ioScheduler),
            userDAO.save(lstUser).subscribeOn(ioScheduler)
        ) }
        .subscribeOn(ioScheduler)
)
  

Я хочу такого же поведения, но с нетерпением для selectAll () и GetAll (), потому что нет причин ждать от db запуска сетевого вызова.

Ответ №1:

Используйте concatMapEagerDelayError :

  Observable.fromIterable(sources)
 .concatMapEagerDelayError(v -> v, true);

 Observable.fromArray(source1, source2, source3)
 .concatMapEagerDelayError(v -> v, true);
  

Javadoc.

Редактировать:

 fun getAll(): Observable<List<User>> = Observable.fromArray(
    // from db
    userDAO
        .selectAll()
        .subscribeOn(ioScheduler),
    // from api
    userAPI
       .getAll()
       // --- this makes no sense by the way -------------------
       .doOnNext { lstUser -> Completable.concatArray(
            userDAO.deleteAll().subscribeOn(ioScheduler),
            userDAO.save(lstUser).subscribeOn(ioScheduler)
       )}
       // ------------------------------------------------------
       .subscribeOn(ioScheduler)
)
.concatMapEagerDelayError({ v -> v }, true)
  

Комментарии:

1. Я отредактировал исходный вопрос с большей точностью. Я не думаю, что это ответ. Или вы можете привести точный пример для моего случая?

2. Я обновил свой ответ. Пожалуйста, в следующий раз заранее предоставьте все необходимые детали.

3. Спасибо и извините. Можете ли вы объяснить мне, почему обновление базы данных не имеет смысла?

4. Вы создаете и выбрасываете Completable в doOnNext . Я сомневаюсь, что это работает, и если это так, вы делаете что-то гораздо худшее в userDAO .

5. Вызов deleteAll и save проходит модульное тестирование. Но, может быть, вы предлагаете другой способ сделать то же самое?