我的问题类似于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。为什么会发生这种情况,如何使它串行运行?预先感谢。
答案 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
因此,如果您想使用getRemoveLicensePlateCompletable
中getNotifyCompletable
的数据,则可以使用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({