代码之家  ›  专栏  ›  技术社区  ›  Michael Vescovo

rxjava single to completable to single-如何将第一个单曲的结果传递给第二个单曲

  •  1
  • Michael Vescovo  · 技术社区  · 6 年前

    在下面的方法中,如何将第一个单曲的结果传递给第二个单曲?

    就像现在写的,当它回来的时候, somethingId 是空的。如果我更改返回的 Single.just(somethingId) 它将返回该值,而不是空字符串。

    有趣的是,如果我在方法中设置断点,它会在进入第5行和第6行之前在第7行停止。

    的文档 andThen 第7行说:

    返回一个将订阅此可完成表的单,一旦完成,则 将订阅{@code next}singlesource。

    为什么它看起来是按这个顺序执行的和/或有更好的方法来执行?

    1 override fun downloadSomething(): Single<String> {
    2    var somethingId = ""
    3    return remoteDataSource.downloadSomething() // this is a Single
    4        .flatMapCompletable { something ->
    5            somethingId = something.id
    6            saveSomething(something) // this is a Completable
    7        }.andThen(Single.just(somethingId))
    8 }
    

    在这一点上,我唯一能想到的是,返回一个 saveSomething() 方法在第6行(有效)。然而,我正在改变那个方法的签名,这样我就可以在这个不正确的方法中使用它。肯定有办法让这件事在不做那件事的情况下奏效吗?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Jose Ignacio Acin Pozo    6 年前

    你可以在不改变的情况下得到同样的结果 saveSomething 方法签名,如果您避免 flatMapCompletable 共操作:

    1 override fun downloadSomething(): Single<String> {
    2    return remoteDataSource.downloadSomething() // this is a Single
    3        .flatMap { something ->        
    4            saveSomething(something).andThen(Single.just(something.id))
    5        }
    6 }
    

    或:

    1 override fun downloadSomething(): Single<String> {
    2    return remoteDataSource.downloadSomething() // this is a Single
    3        .flatMap { something ->        
    4           saveSomething(something).toSingleDefault(something.id)
    5        }
    6 }
    

    你现在的问题是 Single.just(somethingId) 作为rxjava管道创建的一部分执行,因此,它在下载完成之前发生,因此 somethingId 仍然是空字符串。