【问题标题】:How do I slow done a node JS event listener?如何减慢节点 JS 事件侦听器的速度?
【发布时间】:2020-03-22 10:48:30
【问题描述】:

我正在尝试在我的代码中使用无线控制器。我正在使用节点 HID,目前正在尝试编写一些代码,当第一次按下按钮时输出“Tap”,第二次输出“untap”。我面临的唯一问题是单击会触发两个 if 语句,因为侦听器事件刷新得太快了。有什么办法可以减慢速度吗?

    device.on ("data", function (data){

        if (data[4]===31&&(!pressed)){

            device.pause();
            console.log("tap");

            pressed=true;

        }

        if (data[4]===31&&(pressed)){

            device.pause();

            console.log("untap");

            pressed=false;

        }



    device.resume();
    console.log(data[4]);
    console.log(pressed);

    });

(pressed是之前声明的变量)

【问题讨论】:

  • 我不认为你真的想放慢任何速度......我认为你正在寻找“去抖动”。

标签: node.js arduino hid


【解决方案1】:

请改用else if。目前,如果第一个 if 已满足,则将 pressed 设置为 true,但如果第一个 if 已满足,则下一个

if (data[4]===31&&(pressed)){

将是 true,因为 data[4] === 31(因为第一个 if 已完成)您只需将 pressed 设置为 true

这会将日志从tap, untap, tap, untap, tap, untap, tap, untap 减少到tap, untap, tap, untap,但听起来data 事件也会在一次点击时被触发两次,所以在监听器的主体可以被触发之前添加一点延迟再次调用:

let lastDataCall = 0;
device.on("data", function(data) {
  const now = Date.now();
  if (now - lastDataCall < 20) { // 20 milliseconds
    return;
  }
  lastDataCall = now;
  if (data[4] === 31) {
    device.pause();
    if (!pressed) {
      console.log("tap");
      pressed = true;
    } else if ((pressed)) {
      console.log("untap");
      pressed = false;
    }
  }
  device.resume();
  console.log(data[4]);
  console.log(pressed);
});

(如果您在data 处理程序中拥有的唯一代码与点击/取消点击有关,您可以通过returning 尽早修剪,如果data[4] !== 31,它可能会使代码更具可读性)

【讨论】:

  • 这很有道理,这可能是我没有想到的原因。谢谢
  • 遗憾的是这实际上不起作用。它仍然吐出“点击,取消点击,点击,取消点击。按下一次。
  • 您的原始代码是否真的在一次点击-取消点击时记录了tap, untap, tap, untap, tap, untap, tap, untap?我以为你说它只是重复了一次,else if 应该解决这个问题
  • 是的。这就是我要解决的问题。
  • 抱歉,由于某种原因,我无法看到您的全部评论。它多次输出点击和取消点击。对不起,如果我不清楚
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 2014-07-16
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2014-03-14
  • 1970-01-01
相关资源
最近更新 更多