84 votes

Comment chaîner deux Completable dans RxJava2

J'ai deux Completable. Je voudrais faire le scénario suivant: Si le premier Completable arrive à onComplete, continuez avec le second Completable. Les résultats finaux seraient onComplete of second Completable.

Voici comment je le fais lorsque j'ai single loginUtilitaire () et un identifiant Completable () :

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

}
 

142voto

Maksim Ostrovidov Points 5812

Vous recherchez un opérateur andThen .

Retourne un Completable qui exécute d'abord ce Completable, puis l'autre complétable.

 firstCompletable
    .andThen(secondCompletable)
 

En général, cet opérateur est un "remplaçant" pour flatMap sur 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)
 

139voto

Sparky Points 358

TL;DR: les autres réponses manquer une subtilité. Utiliser doThingA().andThen(doThingB()) si vous voulez l'équivalent d' concat, utilisez doThingA().andThen(Completable.defer(() -> doThingB()) si vous voulez l'équivalent d' flatMap.

Les réponses ci-dessus sont en quelque sorte de les corriger, mais je les ai trouvés trompeuse parce qu'ils manquent d'une subtilité sur désireux d'évaluation.

doThingA().andThen(doThingB()) appellerons doThingB() immédiatement, mais seulement de s'abonner à la observables retourné par doThingB() lorsque le observables retourné par doThingA() complète.

doThingA().andThen(Completable.defer(() -> doThingB()) appellerons doThingB() seulement après Une chose est terminée.

Ce n'est important que si doThingB() a des effets secondaires avant de s'abonner événement. E. g. Single.just(sideEffect(1)).toCompletable()

Une mise en œuvre qui n'ont pas d'effets secondaires avant de le abonnez-vous de l'événement (un vrai froid observables) pourrait être Single.just(1).doOnSuccess(i -> sideEffect(i)).toCompletable().

Dans le cas qui vient de me piquer Une chose est certaine logique de validation et d' doThingB() coup d'envoi asynchrone de la base de données mise à jour immédiatement, qui achève une VertX ObservableFuture. Ce qui est mauvais. Sans doute l' doThingB() doit être écrit uniquement mettre à jour la base de données lors de la souscription, et je vais essayer de concevoir les choses de cette façon à l'avenir.

5voto

Deni Erdyneev Points 1024

Essayer

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X