Completable andfThen 在它之前的操作之前执行

Completable andfThen executes before the operation before it

我的问题类似于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 存储到成员变量 licensePlateId 中并删除车牌。然后应通知具有成员 var 电子邮件的所有者有关删除。

实际发生的是getNotifyCompletable 在getRemoveLicensePlateCompletable 之前执行。为什么会发生这种情况,我怎样才能使它连续 运行?提前致谢。

getNotifyCompletable会在getRemoveLicensePlateCompletable之前执行,但是getNotifyCompletable里面的completable会在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

所以如果你想在 getNotifyCompletable 中使用来自 getRemoveLicensePlateCompletable 的数据,你可以使用 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({