我试图检测何时在短时间内发生多次按键。
我的尝试是:
fromEvent(window, 'keydown').pipe(
bufferTime(200),
filter(events => events.length > 1)
);
我的解决方案的问题是事件每200毫秒发出一次。这意味着,如果用户在缓冲区窗口的末尾按下一个键,而在下一个缓冲区窗口的开始又按下另一个键,则不会捕获多键按下。
相反,我希望缓冲区在第一次按键时开始,并在第一次按键后200ms发出。
理想情况下,我想再等待200ms,然后再启动另一个缓冲区。
任何建议表示感谢。
编辑:我已经解决了以下问题。
const keydown$ = fromEvent(window, 'keydown').pipe(share());
const src$ = keydown$.pipe(
buffer(
keydown$.pipe(
debounce(() =>
timer(150)
)
)
)
);
相反,我希望缓冲区在第一次按键时开始,并在第一次按键后200ms发出。
基于此,这可能是一种解决方案:
const keydown$ = fromEvent(window, 'keydown').pipe(share());
const src$ = keydown$.pipe(
buffer(
concat(keydown$.pipe(take(1), ignoreElements()), timer(200)).pipe(repeat())
),
);
share()
将Subject
在数据使用者和数据生产者(keydown
事件)之间放置一个实例。这样,将不会在每个新订户上订阅源。
让我们仔细看看
concat(keydown$.pipe(take(1), ignoreElements()), timer(200)).pipe(repeat())
这样,timer(timer(200
)在第一个按键事件之后启动。在keydown$.pipe(take(1), ignoreElements())
我们使用ignoreElements
,因为我们不想第一个事件后发出的缓冲区,但只有在那些200
毫秒通过。
最后,repeat()
将被使用,因为传递给的两个可观察对象concat
将最终完成(这也指示了将发送累积事件的时刻)。repeat()
完成后将重新订阅concat(...)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句