Completable andfThen在操作之前执行

时间:2019-09-12 23:09:41

标签: rx-java rx-java2

我的问题类似于AndThen executes before completable finished

    getLicensePlateObservable(plateNumber)
                .flatMapCompletable {
                    licensePlateId = it.id
                    getRemoveLicensePlateCompletable(licensePlateId)
                }
                .andThen(getNotifyCompletable(email, licensePlateId))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({

getLicensePlateObservable发出网络请求以获取LicensePlate。我希望它能够获取LicensePlate,将ID存储到成员var licensePlateId中,并删除牌照。然后应将拥有成员var电子邮件的所有者通知删除。

实际发生的是在getRemoveLicensePlateCompletable之前执行了getNotifyCompletable。为什么会发生这种情况,如何使它串行运行?预先感谢。

1 个答案:

答案 0 :(得分:0)

getNotifyCompletable将在getRemoveLicensePlateCompletable之前执行,但是getNotifyCompletable内部可完成的操作将在getRemoveLicensePlateCompletable之后执行。您可以在示例中看到它:

fun main() {
    Completable.fromRunnable {
        Thread.sleep(1000)
        println("finish")
    }
        .andThen(createCompletable("1"))
        .subscribe()
}

fun createCompletable(payload: String): Completable {
    println("create $payload")
    return Completable.fromRunnable {
        println("start $payload")
        Thread.sleep(1000)
        println("end $payload")
    }
}

// will print
// create 1
// finish
// start 1
// end 1

因此,如果您想使用getRemoveLicensePlateCompletablegetNotifyCompletable的数据,则可以使用Sarath Kn提出的解决方案:

getLicensePlateObservable(plateNumber)
    .flatMapCompletable {
        licensePlateId = it.id
        getRemoveLicensePlateCompletable(licensePlateId)
    }
    .andThen(Completable.defer { getNotifyCompletable(email, licensePlateId) })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({

或者您可以显式传递licensePlateId而不使用临时字段:

getLicensePlateObservable(plateNumber)
    .flatMapSingle {
        getRemoveLicensePlateCompletable(it.id).toSingle { it.id }
    }
    .flatMapCompletable { getNotifyCompletable(email, it) }
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({