0

How to implement a Observable.concatEagerDelayError or an equivalent in RxJava2/RxKotlin2 ?

There is :

  • Observable.concatEager
  • Observable.concatDelayError

But not :

  • Observable.concatEagerDelayError

What i have :

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)
)

I want same behaviour but eagerly for selectAll() and getAll() because there is no reason to wait from db to launch network call.

DamienL
  • 577
  • 1
  • 5
  • 14

1 Answers1

1

Use concatMapEagerDelayError:

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

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

JavaDoc.

Edit:

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)
akarnokd
  • 69,132
  • 14
  • 157
  • 192
  • I edited the original question with more precision. I don't think it's the answer. Or can you provide a precise example for my case ? – DamienL Mar 14 '19 at 13:32
  • I've updated my answer. Please, next time, provide all relevant details upfront. – akarnokd Mar 14 '19 at 13:42
  • Thanks and sorry. Can you explain me why refresh database makes no sense ? – DamienL Mar 14 '19 at 13:44
  • You are creating and throwing away a `Completable` in `doOnNext`. I doubt that it works, and if it does, you are doing something far worse in `userDAO`. – akarnokd Mar 14 '19 at 13:46
  • Call to deleteAll and save is unit tested. But maybe you suggest an other way to do same thing ? – DamienL Mar 14 '19 at 16:30
  • I'd suggest `flatMapCompletable` instead of `doOnNext`. – akarnokd Mar 14 '19 at 17:42
  • Thanks. Maybe better to keep `doOnNext` and don't return `Completable` for `deleteAll` and `save` ? – DamienL Mar 20 '19 at 12:15