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({
我的问题类似于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({