gpt4 book ai didi

javascript - 如何在 RxJS 中创建切换流?

转载 作者:行者123 更新时间:2023-12-02 15:23:35 25 4
gpt4 key购买 nike

我想创建一个基于 keyupkeydown 切换的 Steam。键代码在 keydown 事件上发出一次,并在 keyup 事件上再次发出。我使用 distinctUntilChanged 来防止在 keydown 触发时发送多个键代码。我的代码的问题是,由于 distinctUntilChanged,我无法对同一键代码执行连续的 keydownkeyup

目前,按下并释放“a”后紧接着“b”有效,但按下并释放“a”后紧跟“a”则无效。

要求

我想要实现的是:

  • 当按键按下时,执行一些任务
  • 当 key 抬起时,停止执行该任务
  • 多个按键可以向下或向上(因此不能使用 keypress 事件)
  • 不同的操作与不同的键相关联(认为“a”代表操作 1,“b”代表操作 2)

代码

var getKeyCode = function(e) { return e.which; }
var target = document.querySelector('body');

var keyDownStream = Rx.Observable.fromEvent(target, 'keydown')
.distinctUntilChanged(getKeyCode);

var keyUpStream = Rx.Observable.fromEvent(target, 'keyup')
.distinctUntilChanged(getKeyCode);

var toggleStream = Rx.Observable.merge(keyDownStream, keyUpStream);

toggleStream.subscribe(function(e) {
console.log(e.which);
});

最佳答案

我用过:

var toggleStream = Rx.Observable.fromEvent(document.body, 'keydown').filter(function ( e, index ) {
return index < 1;
}).takeUntil(Rx.Observable.fromEvent(document.body, 'keyup')).repeat();

toggleStream.subscribe(function ( e ) {
// the task should go here
console.log("key down :" + e.which);
});

你可以在这里找到一个jsbin:http://jsbin.com/xuqasawese/edit?html,js,console,output

目前,按下并释放“a”,然后再按下“b”,以及按下并释放“a”,然后再按下“a”。然而,您可以想象一下,您按下了“a”键,并且在不释放该键的情况下,按下了另一个“b”键,然后释放了“b”。然后按另一个键“c”,您的操作将被执行。这是一种极端情况,但是如果发生这种情况,您是否有任何预期的行为?

关于javascript - 如何在 RxJS 中创建切换流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33874581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com