如何在RxJava2中链接两个Completable

我有两个可完成的。 我想做以下场景:如果第一个Completable到达onComplete,继续第二个Completable。 最终结果将是第二次完成的完成。

当我有单个getUserIdAlreadySavedInDevice()和Completable login()时,我就是这样做的:

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

您正在寻找andThen运营商。

返回首先运行此Completable然后另一个可完成的Completable。

 firstCompletable .andThen(secondCompletable) 

通常,此运算符是Completable flatMap的“替换”:

 Completable andThen(CompletableSource next)  Maybe andThen(MaybeSource next)  Observable andThen(ObservableSource next)  Flowable andThen(Publisher next)  Single andThen(SingleSource next) 

TL; DR:其他答案错过了一个微妙之处。 如果你想要等效的concat ,请使用doThingA().andThen(Completable.defer(() -> doThingB())使用doThingA().andThen(Completable.defer(() -> doThingB())如果你想要等效的flatMap ,请使用doThingA().andThen(Completable.defer(() -> doThingB())

上面的答案是正确的,但我发现它们具有误导性,因为它们错过了关于热切评价的微妙之处。

doThingA().andThen(doThingB())将立即调用doThingB() ,但只有在doThingB()返回的doThingA()完成时才订阅doThingB()返回的doThingA()

doThingA().andThen(Completable.defer(() -> doThingB()) doThingB()只有在事物A完成后才会调用doThingB()

仅当doThingB()在订阅事件之前具有副作用时,这才是重要的。 例如Single.just(sideEffect(1)).toCompletable()

在subscribe事件(真正的冷可观察)之前没有副作用的实现可能是Single.just(1).doOnSuccess(i -> sideEffect(i)).toCompletable()

如果只是咬了我的东西A是一些validation逻辑, doThingB()立即启动异步数据库更新,完成VertX ObservableFuture。 这是不好的。 可以说doThingB()应该只在订阅时才更新数据库,我将尝试在将来以这种方式设计。

尝试

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)