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

rxjava single.tocompletable()似乎以某种方式打破了单一

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

    注释 :原来 toCompletable() 不是错误,而是调用代码。调用代码使得更改此方法使其工作(或不工作)。


    我有以下方法。它返回一个单曲。它起作用了。执行内部的代码,使得remotedatasource single下载数据和 doOnSuccess 运行,我可以在那里断点。

    但是,如果像第二个示例那样将其转换为completable,则它将停止工作。数据没有下载,里面的代码 成功之路 永远不要跑。

    我想在这个方法中将它转换为completable,因为调用这个方法的方法不需要数据,只需要成功/错误结果。

    知道为什么会这样吗?

    文件上说

    返回{@link completable},丢弃{@link single}的结果 当这个源{@link single}调用{@code oncomplete}时 {@code onsuccess}。传播错误终端事件。

    但我认为这意味着它将丢弃调用方法的东西,而不是当前方法的东西。通过转换为completable,即使是远程数据源也不会下载数据。

    工作:

    override fun downloadSomethingList(): Single<List<Something>> {
        return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
          .doOnSuccess { it: Map<String, List<Something>>
            saveHash(SOMETHING_HASH, it.keys.first())
            localDataSource.replaceSomethingList(it.values.first())
          }.map {
              it.values.first()
          }
    }
    

    破碎:

    override fun downloadSomethingList(): Completable {
        return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
            .doOnSuccess { it: Map<String, List<Something>>
              saveHash(SOMETHING_HASH, it.keys.first())
              localDataSource.replaceSomethingList(it.values.first())
            }.toCompletable()
    }
    

    更新:

    好的,这是我的调用方法。是的,有点复杂。可能是里面的东西引起了这个问题。

    fun downloadData(): Completable {
        ...
        return repository.downloadThing1()
            .flatMap { downloadedThing1 ->
                ...
                repository.downloadThing2().toSingle()
            }
            .flatMap {
                repository.getThing2()
            }.flatMap { thing2 ->
                ...
                repository.saveThing1(thing1).toSingle()
            }
            .flatMap {
                if ("some condition") {
                    repository.downloadThing3()
                        .andThen(repository.downloadThing4())
                        .andThen(repository.downloadThing5())
                        .andThen(repository.downloadThing6()).toSingle()
                } else {
                    Completable.complete().toSingle()
                }
            }.toCompletable()
            .doOnComplete {
                ...
            }
    }
    

    更新2:

    如果我使用下面的调用代码,它就会工作! 所以我们得到的教训是,调用代码肯定会破坏上游 . 更具体地说,我认为 toSingle() 电话。相反,我发现 flatMapCompletable 似乎是为了这个目的而设计的。

    由于问题中的原始代码实际上没有任何错误,我不得不将这一点授予sanford,因为他证明了这一点。

    fun downloadData(): Completable {
        ...
        return repository.downloadThing1()
            .flatMapCompletable { downloadedThing1 ->
                ...
                repository.downloadThing2()
            }.andThen(repository.getThing2())
            .flatMapCompletable { thing2 ->
                ...
                repository.saveThing1(thing1)
                if ("some condition") {
                    repository.downloadThing3()
                        .andThen(repository.downloadThing4())
                        .andThen(repository.downloadThing5())
                        .andThen(repository.downloadThing6())
                } else {
                    Completable.complete()
                }
            }
            .doOnComplete {
                ...
            }
    }
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Sanf0rd    6 年前

    我做了一个小代码来尝试它,它正在工作:

    val single = Single.create<Int> { emitter ->  emitter.onSuccess(5) }
    val completable = single.map { it * 2 }.doOnSuccess { Log.d("MyTag", "$it")}.toCompletable()
    
    completable.subscribe()
    

    请确保使用单一和完整版本调用subscribe。