我有以下信息流。
js.Dynamic
但是,我从不想要重复(同时)网络调用(内部平面图)。如果Observable.just(Unit) // execute immediately
.mergeWith(tryAgainRelay) // execute again when this relay emits
.flatMap {
api.call() // emits sealed class single containing `Success` or `Error` state
.toObservable()
.startWith(Loading) // emit loading (same sealed class as above)
}
在网络呼叫已经开始时发出,我希望丢弃此发射。我可以使用以下代码来避免它们:
tryAgainRelay
它有点难看,并且涉及使用var isLoading = false // track whether api call is in flight
Observable.just(Unit)
.mergeWith(tryAgainRelay)
.filter { isLoading.not() } // prevent emissions if api call is already in flight
.flatMap {
api.call()
.toObservable()
.startWith(Loading)
// update state variable
.doOnNext {
isLoading = when (it) {
Loading -> true
is Error, is Success -> false
}
}
}
踩到流外。有没有更好,更惯用的方法来做到这一点?
答案 0 :(得分:0)
使用concatMap
代替flatMap
。
重试将依次创建并依次“排队”,因此您可以确保仅并行执行一个请求(下一个请求将在上一个完成时开始-完成或错误-和(如果tryAgainRelay
已经发出)。