如何实现类似flatMapFirst
的{{1}}运算符,但只有在前一个运算符结束时才添加新的observable?如果前一个仍然在运行,它只会忽略新的observable。如何在RxJava 2中实现它?
它已经存在于培根中 - flatMapFirst 在凯菲尔 - flatMapFirst。
答案 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()
}