我如何缓慢完成节点 JS 事件侦听器?
How do I slow done a node JS event listener?
我正尝试在我的代码中使用无线控制器。我正在使用节点 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是前面声明的变量)
改用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
处理程序中拥有的唯一代码与 tapping/untapping 相关,您可以 trim 尽早 return
ing if data[4] !== 31
, 它可能会使代码更具可读性)
我正尝试在我的代码中使用无线控制器。我正在使用节点 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是前面声明的变量)
改用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
处理程序中拥有的唯一代码与 tapping/untapping 相关,您可以 trim 尽早 return
ing if data[4] !== 31
, 它可能会使代码更具可读性)