tutorial rxjava2 rxjava compositedisposable java rx-java rx-java2

rxjava2 - rxjava tutorial



Cómo encadenar dos Completable en RxJava2 (3)

Tengo dos Completable. Me gustaría hacer el siguiente escenario: Si primero Completable llega a onComplete, continúe con segundo Completable. Los resultados finales estarían en Completo del segundo Completable.

Así es como lo hago cuando tengo Single getUserIdAlreadySavedInDevice () y inicio de sesión Completable () :

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


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

Las respuestas anteriores son correctas, pero las encontré confusas porque extrañan una sutileza sobre la evaluación impaciente.

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

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

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

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

En el caso de que solo me haya mordido la cosa A es una 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 la base de datos al suscribirse, y voy a intentar diseñar las cosas de esa manera en el futuro.



Usted está buscando y andThen operador.

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)