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

Rx java 如何避免Rx流中的重复网络呼叫?,rx-java,system.reactive,rx-java2,Rx Java,System.reactive,Rx Java2,我有下面的流 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()

我有下面的流

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)
    }
但是,我从不希望重复(同时)网络调用(内部flatmap)。如果
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
            }
          }
        }

这有点难看,需要使用
.doOnNext()
走出流。有更好、更惯用的方法吗?

使用
concatMap
而不是
flatMap


重试将依次“排队”创建,因此您可以确保只有一个请求将并行执行(下一个请求将在前一个请求完成时启动-完成或出错-,如果
tryAgainRelay
已发出,则启动下一个请求).

您可以对api调用使用
retry
吗?如何重试帮助?这只会影响onError,对吗?“如果tryAgainRelay在网络呼叫已在飞行时发出,我希望此发射被丢弃”我认为您应该尝试使用
skipUntil
操作员。但您可能必须共享
api.call().toObservable()
使用
switchMap()
操作符,而不是
flatMap()
@RafaelGuillen no.
switchMap
将使用新的网络请求替换正在进行的请求。我希望在请求已在进行时丢弃新请求