使用RXJS,我如何可以观察到从第一次按下到时间窗口结束时按下的所有按键?

编程专家

我试图检测何时在短时间内发生多次按键。

我的尝试是:

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)
            )
        )
    )
);
安德烈·盖特伊(AndreiGătej)

相反,我希望缓冲区在第一次按键时开始,并在第一次按键后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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

VB.NET 如何在将其捕获为热键时避免第一次按下按键?

如何使事件仅在第一次按下按钮时发生?

ngIf块内部可观察到的角度rxjs错过了第一次更新

当我第一次按下按钮时,它不会执行我的 JavaScript,直到我第二次按下它

有没有一种方法可以防止计划的管道在第一次执行尚未结束时再次执行?

从最后一次观察到第一次观察在Stata中模拟AR(1)

按下时突出显示的UIButton不会在第一次按下时突出显示

第一次调度后可观察到的redux多个动作

第一次按下按钮时在android中关闭警报对话框

javascript切换在第一次按下时不起作用

Javascript-动画仅在第一次按下按钮时起作用

我第一次按Ctrl + C时无法停止程序

禁用按钮第一次起作用,但一次按下后不起作用,我该如何解决?

仅在第一次时如何重新加载按页眉

使用 R 根据另一列中事件的第一次出现创建开始时间和结束时间列

RxJS 观察到的数组没有按预期工作

如何使用KeyPress一次按下3个按键?

如何使在文档打开时按下的功能区切换按钮在第一次切换时正常运行?

当我第一次单击“删除”按钮时,所有注释都消失了,但是,当我刷新页面时,它可以正常工作

如何仅在第一次出现结束字符串之前替换所有内容?

Python/Curses:第一次按键时什么也没有发生

onTouchListener切换按钮,忽略第一次按下?

第一次按下javascript后,onkeyup无法正常工作

JQuery 在第一次结束时调用动画函数

为什么nextjs在我构建时在第一次加载时加载所有页面

在extjs中,如何在默认情况下使列不可见,因为当用户第一次打开它时,它会显示所有列?

RxJS可以观察到。我有参考资料后如何重新发射

LiveData,如何避免注册观察者时的第一次回调

第一次发射时的RXJS