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(…)
完成后。

我决定做一些不同的事情,但您的输入很有帮助。我已在问题中添加了我的最终代码。很高兴我能提供帮助!您使用的方法很好