#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);
Редактировать:
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 проходит модульное тестирование. Но, может быть, вы предлагаете другой способ сделать то же самое?