flatMapFirst:flatMap仅在前一个结束时才添加新的observable

时间:2017-01-24 11:49:08

标签: android rx-java rx-java2

如何实现类似flatMapFirst的{​​{1}}运算符,但只有在前一个运算符结束时才添加新的observable?如果前一个仍然在运行,它只会忽略新的observable。如何在RxJava 2中实现它?

它已经存在于培根中 - flatMapFirst 在凯菲尔 - flatMapFirst

enter image description here

3 个答案:

答案 0 :(得分:4)

您不需要新的运算符,而是现有运算符的组合:

source.onBackpressureLatest().flatMap(function, 1)

FlatMap将同时运行1个内部源,如果flatMap运行1个内部源,onBackpressureLatest将继续删除外部源值(最新除外)。

如果您不想继续使用源代码中的最新版本,请考虑改为使用onBackpressureDrop

答案 1 :(得分:0)

David's answer的后续行动。如果你想在RxJava 2 flatMapFirst而不是Observable中找到Flowable,那么这是一个快速的Kotlin实现:

fun <T, R> Observable<T>.flatMapFirst(transform: (T) -> Observable<R>) =
    toFlowable(BackpressureStrategy.DROP)
        .flatMap({ transform(it).toFlowable(BackpressureStrategy.BUFFER) }, 1)
        .toObservable()

UPD。基于David Karnok建议的替代实施:

fun <T, R> Observable<T>.flatMapFirst(transform: (T) -> Observable<R>) =
    Observable.defer {
        val busy = AtomicBoolean()
        return@defer this
                .filter { busy.compareAndSet(false, true) }
                .flatMap {
                    transform(it).doAfterTerminate { busy.set(false) }
                }
    }

答案 2 :(得分:0)

我设法解决了这个问题:

/**
 * Flatmaps upstream items into [source] items.
 * Ignores upstream items if there is any [source] instance currently running.
 *
 * ```
 * upstream ----u-----u---u-------u---------------|-->
 *              ↓                 ↓               ↓
 * source       ---s-------|->    ---s-------|->  ↓
 *                 ↓                 ↓            ↓
 * result   -------s-----------------s------------|-->
 * ```
 */
fun <T, R> Observable<T>.flatMapWithDrop(source: Observable<R>): Observable<R> {
  return this.toFlowable(BackpressureStrategy.DROP)
    .flatMap({ source.toFlowable(BackpressureStrategy.MISSING) }, 1)
    .toObservable()
}