如何在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)