RxJava Return single, execute completable after

2020-07-06 02:45发布

问题:

I'm trying to accomplish the following: Return some data as single, execute a completable after. The following code does not compile due to single.andThen(). The actions need to be executed in this order.

val single = Single.create<String> { it.onSuccess("result") }
val completable = Completable.create { println("executing cleanup") }
val together = single.andThen(completable)

together.subscribe(
        { println(it) },
        { println(it) }

)

回答1:

Use flatMap:

single.flatMap(v -> completable.andThen(Single.just(v)))


回答2:

There is a special flatMapCompletable operator in RxJava2:

single.flatMapCompletable(result -> completable);



回答3:

If anyone is interested in a the RxSwift solution:

saveObjectsA().flatMap { (objectsA: [A]) -> Single<Bool> in
        B.objects = objectsA
        return completable.andThen(Single.just(true))
    }

saveObjectsA returns a Single<[A]> which is an attribute of B (created previously). I needed to save it before saving B.



回答4:

Assuming you actually want to return the Single after the Completable, here's another way:

Using Java:

single.flatMap(x -> completable.toSingleDefault(x))

Using Kotlin:

single.flatMap { completable.toSingleDefault(it) }