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.