我正在寻找一位运营商debounce
一系列的事件,比如说用户的点击。输入和输出应该是这样的:
interval : -> <- -> <-
in : 1--2--3-------4--5--5--6-7-8--------
out : 1-------------4---------------------
这个想法就像下划线的反跳immediate
option on
http://underscorejs.org/#debounce http://underscorejs.org/#debounce。该运算符可以用任何支持反应式扩展的语言来呈现/实现
编辑:澄清间隔,假设 5 秒(两个箭头之间有 5 个空格):-> <-
Edit2:一个更容易理解的版本:我有一个用户,他反复单击一个按钮(1,2,3);我想抓住第一click
(1) 忽略其余部分。过了一会儿,他累了,休息7秒(比两个箭头之间的5秒间隔长),然后继续再次点击按钮(4,5,6,7,8)我想抓住第一个click
(4) 忽略其余部分。
如果他在第四个箭头后点击,我也想捕捉到该点击。
Edit3: Here is an image which can be found at the original article https://css-tricks.com/debouncing-throttling-explained-examples/#article-header-id-1
Edit:根据澄清,RxJava 没有用于此类流程的运算符,但它可以由一组重要的其他运算符组成:
import java.util.concurrent.TimeUnit;
import rx.Observable;
public class DebounceFirst {
public static void main(String[] args) {
Observable.just(0, 100, 200, 1500, 1600, 1800, 2000, 10000)
.flatMap(v -> Observable.timer(v, TimeUnit.MILLISECONDS).map(w -> v))
.doOnNext(v -> System.out.println("T=" + v))
.compose(debounceFirst(500, TimeUnit.MILLISECONDS))
.toBlocking()
.subscribe(v -> System.out.println("Debounced: " + v));
}
static <T> Observable.Transformer<T, T> debounceFirst(long timeout, TimeUnit unit) {
return f ->
f.publish(g ->
g.take(1)
.concatWith(
g.switchMap(u -> Observable.timer(timeout, unit).map(w -> u))
.take(1)
.ignoreElements()
)
.repeatWhen(h -> h.takeUntil(g.ignoreElements()))
);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)