当前位置: 首页 > 知识库问答 >
问题:

如何在RxJava2中链接两个可完成的

张高澹
2023-03-14

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

这就是我在使用单getUserIdAlreadySavedInDevice()和Compltable login()时的做法:

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

}

共有3个答案

邢弘业
2023-03-14

尝试

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)

祖麻雀
2023-03-14

TL;DR:其他答案遗漏了一个微妙之处。使用doThingA()。然后(doThingB())如果您想要与concat等效,请使用doThingA()。然后(可完成。延迟()-

  • flatMap()merge()的映射版本
  • 是concat()的映射版本
  • 对于可完成的,您需要使函数调用像单个或可观察的(或者最好是这样,在点击订阅之前什么都不会发生-这是一个很好的惯例,在官方Rx库以及我遇到的任何Rx扩展中都会用到,对于高级用户,这只指冷完成,但大多数人可以忽略这一点)
  • 唯一的区别是语法

一些示例:

>

  • foo(a). and然后(bar(b))将:

    1. 致电foo(a)
    2. 即使步骤1返回的completable返回错误,也要立即调用bar(b)
    3. 订阅任何返回的步骤
    4. 仅当最后一步成功完成时,才会订阅条形图(b)的结果

    foo(a)。然后(可完成。延迟()-

    1. 调用foo(a)
    2. 订阅步骤1
    3. 的结果
    4. 只有当foo(a)返回的可完成项成功时,才调用bar(b)

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

    上面的答案有点正确,但我发现它们有误导性,因为它们忽略了渴望评估的微妙之处。

    doThingA()。然后(doThingB())将立即调用doThingB(),但只有当doThingA()返回的可观察对象完成时,才订阅doThingB()html" target="_blank">返回的可观察对象。

    doThingA()。然后(可完成。延迟()-

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

    在subscribe事件之前没有副作用的实现(真正的冷可观察)可能是单一的。仅(1)。doOnSuccess(一)-

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

  • 颜嘉誉
    2023-03-14

    您正在查找第二个操作员。

    返回一个Completable,该Completable首先运行此Completable,然后运行另一个Completable。

    firstCompletable
        .andThen(secondCompletable)
    

    通常,此运算符是可完成的平面图的“替换”:

    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)
    
     类似资料:
    • 问题内容: 我有两个完成。我想做以下情形:如果第一个Completable到达onComplete,则继续第二个Completable。最终结果将是第二完成的onComplete。 当我有单个 getUserIdAlreadySavedInDevice() 和Completable login() 时,这就是我的方法: 问题答案: 您正在寻找运营商。 返回一个Completable,它首先运行此C

    • 如果我对如何使用RxJava2缺乏基本的了解,请提前道歉,因为在我看来,这应该是非常基本的东西。我已经因为不成功的Google搜索而绞尽脑汁,所以欢迎任何资源推荐。为了清晰起见,我选择使用解决方法代码的“净化”表示。 我有一个RxJava2函数,它返回一个

    • 这是我的一个货车租赁数据库的起始代码。 如何将汽车链接到该位置。例如,CBD的位置有Wicked,Zepplin和Floyd,Penrith有Queen。因此,如果命令行参数具有“打印CBD”,那么它必须显示CBD中可用的货车。 任何帮助将不胜感激。

    • 我正在尝试将方法的调用/结果链接到下一个调用。我得到了编译时错误方法,因为if无法从前一次调用中获得objB的引用。 如何将上一次调用的结果传递给下一个链?我是不是完全误解了这个过程?

    • 我正在尝试将我的两个Android布局连接起来,并完成这个过程。 MainActivity.java 记录活动。Java语言 content_main.xml recording.xml AndroidManifest。xml 堆栈跟踪04-22 14:24:09.415 4470-4470/andler.java:102E/AndroidRuntime: FATAL EXCEPTION: mai

    • 大家好,我正在尝试在两个双链接列表之间完全交换两个节点(值和地址也是)。只有位于相同位置的节点才能在两个节点之间交换,即位置2的节点只能由另一个LinkedList中位置2的节点交换。考虑下面的2个链接列表示例: 假设我们想交换第三个元素,即162和830。交换后,领英列表变成: 我已经尝试了下面的代码,但它不能替换前面的元素。 我怎样才能完成这项任务? elseif不交换前面的元素,例如,如果我