Android Studio环境下用concatMap在fetchMessage前执行insertMessage的实现问题
如何用concatMap在fetchMessage前执行insertMessage?
我来帮你搞定这个需求!首先咱们得回忆下RxJava里concatMap的特性——它会按顺序执行任务序列,前一个任务完成后才会触发下一个,正好匹配你要先跑insertMessage再执行fetchMessage的要求。
先看修改后的完整代码
如果insertMessage本身已经返回Completable,直接这么写最简洁:
fun translate(Id: String): Completable { return insertMessage(Id) .concatMapCompletable { // 这里是insertMessage执行完成后才会触发的逻辑 repository.fetchMessage(Id) .flatMap { Single.fromCallable { update(messageId, it, State.COMPLETED) State.COMPLETED } } .onErrorReturn { update(Id, null, State.ERROR) State.ERROR } .toCompletable() } }
如果需要把insertMessage包装成Completable(比如它原本没有返回值),可以用Completable.fromCallable:
fun translate(Id: String): Completable { return Completable.fromCallable { insertMessage(Id) } .concatMapCompletable { repository.fetchMessage(Id) .flatMap { Single.fromCallable { update(messageId, it, State.COMPLETED) State.COMPLETED } } .onErrorReturn { update(Id, null, State.ERROR) State.ERROR } .toCompletable() } }
关键细节说明
- 这里用
concatMapCompletable而不是普通的concatMap,是因为我们的前置任务insertMessage返回的是Completable,这个变体专门用来处理Completable类型的序列衔接,能保证严格的执行顺序。 - 你原来的
fetchMessage后续逻辑(flatMap、onErrorReturn这些)完全可以原封不动放到concatMapCompletable的lambda里,只是给整个流程加了一个前置执行的任务。 - 注意下原始代码里的
messageId,如果是笔误记得换成传入的Id参数哦~
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

