如何避免Rx流中重复的网络呼叫?

时间:2017-10-03 05:39:58

标签: rx-java system.reactive rx-java2

我有以下信息流。

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 } } } 踩到流外。有没有更好,更惯用的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

使用concatMap代替flatMap

重试将依次创建并依次“排队”,因此您可以确保仅并行执行一个请求(下一个请求将在上一个完成时开始-完成或错误-(如果tryAgainRelay已经发出)。