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