如何在RxJava2中链接两个Comppleable

2022-08-31 12:39:51

我有两个可完成。我想做以下场景:如果第一个Comppletable进入onComplete,继续第二个Comppletable。最终结果将是第二个Complete。

这就是我在拥有 Single getUserIdAlreadySavedInDevice() 和 Completable login() 时的做法:

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

}

答案 1

您正在寻找操作员。andThen

返回一个Comppletable,它首先运行此Comppletable,然后运行另一个Comppletable。

firstCompletable
    .andThen(secondCompletable)

通常,此运算符是 on 上的 “替代”:flatMapCompletable

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)

答案 2

TL;DR:其他答案遗漏了一个微妙之处。如果需要等效项,请使用 ,如果需要等效项,请使用。doThingA().andThen(doThingB())concatdoThingA().andThen(Completable.defer(() -> doThingB())flatMap


编辑:更完整的参考

  • flatMap()是的映射版本merge()
  • concatMap()是的映射版本concat()
  • 对于一个,你需要使函数调用像在映射函数中一样懒惰(或者最好让它在你点击订阅之前什么都不发生 - 这是一个很好的约定,用于官方Rx库以及我遇到的任何Rx扩展,对于高级用户来说,这仅指冷可操作,但大多数人可以忽略这一点)。Completabledefer()SingleObservable
  • 和 之间的唯一区别是语法concat(a, b)a.andThen(b)

一些例子:

  • foo(a).andThen(bar(b))将:

    1. foo(a)
    2. 立即调用 bar(b) 即使步骤 1 返回的可操作返回错误
    3. 订阅返回的任何步骤1
    4. 然后,仅当最后一步成功完成时才会订阅结果bar(b)
  • foo(a).andThen(Completable.defer(() -> bar(b))将:

    1. foo(a)
    2. 订阅步骤的结果1
    3. 仅当 由 foo(a) 返回的可满足性成功时,才调用 bar(b)

我将省略它的处理,因为它变得有点复杂,但长话短说,如果你想要“并行性”,那就是一个可以调用的。merge()


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

doThingA().andThen(doThingB())将立即调用,但仅订阅当可观察量返回完成时返回的可观察量。doThingB()doThingB()doThingA()

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

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

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

在只是咬我的情况下,A是一些验证逻辑,并立即启动异步数据库更新,完成VertX ObservableFuture。这很糟糕。可以说应该编写为仅在订阅时更新数据库,并且我将尝试在将来以这种方式设计事物。doThingB()doThingB()


推荐