I have two Completable. I would like to do following scenario: If first Completable gets to onComplete , continue with second Completable. The final results would be onComplete of second Completable.
This is how I do it when I have Single getUserIdAlreadySavedInDevice() and Completable login():
@Override
public Completable loginUserThatIsAlreadySavedInDevice(String password) {
return getUserIdAlreadySavedInDevice()
.flatMapCompletable(s -> login(password, s))
}
You are looking for andThen
operator.
Returns a Completable that first runs this Completable and then the other completable.
firstCompletable
.andThen(secondCompletable)
In general, this operator is a "replacement" for a flatMap
on 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)
TL;DR: the other answers miss a subtlety. Use doThingA().andThen(doThingB())
if you want the equivalent of concat
, use doThingA().andThen(Completable.defer(() -> doThingB())
if you want the equivalent of flatMap
.
The above answers are sort of correct, but I found them misleading because they miss a subtlety about eager evaluation.
doThingA().andThen(doThingB())
will call doThingB()
immediately but only subscribe to the observable returned by doThingB()
when the observable returned by doThingA()
completes.
doThingA().andThen(Completable.defer(() -> doThingB())
will call doThingB()
only after thing A has completed.
This is important only if doThingB()
has side effects before a subscribe event. E.g. Single.just(sideEffect(1)).toCompletable()
An implementation that doesn't have side effects before the subscribe event (a true cold observable) might be Single.just(1).doOnSuccess(i -> sideEffect(i)).toCompletable()
.
In the case that's just bitten me thing A is some validation logic and doThingB()
kicks off an asynchronous database update immediately that completes a VertX ObservableFuture. This is bad. Arguably doThingB()
should be written to only update the database upon subscribe, and I'm going to try and design things that way in the future.
Try
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)
来源:https://stackoverflow.com/questions/42680980/how-to-chain-two-completable-in-rxjava2