Javascript 有了RXJS,我怎样才能获得从第一次按下到时间窗口结束的可观察按键?
我试图在短时间内检测多个按键的发生 我的尝试是:Javascript 有了RXJS,我怎样才能获得从第一次按下到时间窗口结束的可观察按键?,javascript,rxjs,observable,buffer,Javascript,Rxjs,Observable,Buffer,我试图在短时间内检测多个按键的发生 我的尝试是: fromEvent(window, 'keydown').pipe( bufferTime(200), filter(events => events.length > 1) ); 我的解决方案的问题是每200ms发出一次事件。这意味着,如果用户在缓冲区窗口的末尾按下一个键,在下一个缓冲区窗口的开头按下另一个键,则不会捕获多个按键 相反,我希望缓冲区在第一次按键时启动,并在第一次按键后200毫秒发出 理想情况下,我希
fromEvent(window, 'keydown').pipe(
bufferTime(200),
filter(events => events.length > 1)
);
我的解决方案的问题是每200ms发出一次事件。这意味着,如果用户在缓冲区窗口的末尾按下一个键,在下一个缓冲区窗口的开头按下另一个键,则不会捕获多个按键
相反,我希望缓冲区在第一次按键时启动,并在第一次按键后200毫秒发出
理想情况下,我希望在允许另一个缓冲区启动之前再等待200毫秒
感谢您的建议
编辑:我已经决定了以下几点
const keydown$ = fromEvent(window, 'keydown').pipe(share());
const src$ = keydown$.pipe(
buffer(
keydown$.pipe(
debounce(() =>
timer(150)
)
)
)
);
相反,我希望缓冲区在第一次按键时启动,并在第一次按键后200毫秒发出
基于此,这里可能有一个解决方案:
const keydown$=fromEvent(窗口,'keydown').pipe(share());
const src$=keydown$.pipe(
缓冲区(
concat(keydown$.pipe(take(1),ignoreElements()),timer(200)).pipe(repeat())
),
);
share()
将在数据使用者和数据生产者之间放置一个Subject
实例(keydown
事件)。这样,就不会在每个新订户上订阅源
让我们仔细看看
concat(keydown$.pipe(take(1),ignoreElements()),timer(200)).pipe(repeat())
这样,计时器(timer(200
)在第一个keydown事件之后启动。在keydown$.pipe(take(1),ignoreElements())
中,我们使用ignoreElements
,因为我们不希望在第一个事件之后发出缓冲区,而只希望在那些200
毫秒之后发出
最后,将使用
repeat()
,因为传递给concat
的两个观察值最终都将完成(这也表示将发送累积事件的时刻)。repeat()
将重新订阅concat(…)
完成后。我决定做一些不同的事情,但您的输入很有帮助。我已在问题中添加了我的最终代码。很高兴我能提供帮助!您使用的方法很好