Cómo encadenar dos Completables en RxJava2


Tengo dos Completables. Me gustaría hacer el siguiente escenario: Si el primer Completable llega a onComplete , continúe con el segundo Completable. Los resultados finales serían onComplete de segunda Completable.

Así es como lo hago cuando tengo un único getUserIdAlreadySavedInDevice () y un inicio de sesión completo ():

@Override
public Completable loginUserThatIsAlreadySavedInDevice(String password) {
    return getUserIdAlreadySavedInDevice()
            .flatMapCompletable(s -> login(password, s))

}
Author: Maksim Ostrovidov, 2017-03-08

3 answers

Está buscando el operador andThen.

Devuelve un Completable que primero ejecuta este Completable y luego el otro completable.

firstCompletable
    .andThen(secondCompletable)

En general, este operador es un "reemplazo" para un flatMap en Completable:

Completable       andThen(CompletableSource next)
<T> Maybe<T>      andThen(MaybeSource<T> next)
<T> Observable<T> andThen(ObservableSource<T> next)
<T> Flowable<T>   andThen(Publisher<T> next)
<T> Single<T>     andThen(SingleSource<T> next)
 58
Author: Maksim Ostrovidov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-15 11:36:20

TL; DR: las otras respuestas pierden una sutileza. Use doThingA().andThen(doThingB()) si desea el equivalente de concat, use doThingA().andThen(Completable.defer(() -> doThingB()) si desea el equivalente de flatMap.

Las respuestas anteriores son algo correctas, pero las encontré engañosas porque pierden una sutileza sobre la evaluación ansiosa.

doThingA().andThen(doThingB()) llamará a doThingB() inmediatamente pero solo se suscribirá al observable devuelto por doThingB() cuando el observable devuelto por doThingA() se complete.

doThingA().andThen(Completable.defer(() -> doThingB()) llamará doThingB() solo después de que la cosa A tiene completo.

Esto es importante solo si doThingB() tiene efectos secundarios antes de un evento de suscripción. Por ejemplo, Single.just(sideEffect(1)).toCompletable()

Una implementación que no tiene efectos secundarios antes del evento subscribe (un verdadero observable en frío) podría ser Single.just(1).doOnSuccess(i -> sideEffect(i)).toCompletable().

En el caso que es solo me mordió cosa A es alguna lógica de validación y doThingB() inicia una actualización de base de datos asíncrona inmediatamente que completa un VertX ObservableFuture. Esto es malo. Podría decirse que doThingB() debe escribirse solo para actualizar el base de datos al suscribirse, y voy a tratar de diseñar las cosas de esa manera en el futuro.

 8
Author: Sparky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-15 21:06:05

Intenta

Completable.concat

Returns a Completable which completes only when all sources complete, one after another.

Http://reactivex.io/RxJava/javadoc/io/reactivex/Completable.html#concat(java.lang.Iterable)

 3
Author: Deni Erdyneev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-16 12:20:48