Javascript 限制事件侦听器每秒可以触发的次数

Javascript 限制事件侦听器每秒可以触发的次数,javascript,Javascript,我正在玩Gamepad API,特别是使用控制器上的操纵杆的轴。这些信息的位置经常更新,因此,我所听到的事件(棍子上的移动)也经常发生。有没有办法将其限制在每秒25次以减少延迟?初始化一个变量,该变量在每次事件侦听器激活时递增。使事件侦听器输出的函数仅在变量小于25时发生。您不能限制JavaScript事件的触发速率,但您的事件处理程序可以选择在某些调用上不执行任何操作。下面是一个使用mousemove的示例(我不知道您在谈论哪个Gamepad API): 您可以这样做,检查在1秒间隔内调用事件

我正在玩Gamepad API,特别是使用控制器上的操纵杆的轴。这些信息的位置经常更新,因此,我所听到的事件(棍子上的移动)也经常发生。有没有办法将其限制在每秒25次以减少延迟?

初始化一个变量,该变量在每次事件侦听器激活时递增。使事件侦听器输出的函数仅在变量小于25时发生。

您不能限制JavaScript事件的触发速率,但您的事件处理程序可以选择在某些调用上不执行任何操作。下面是一个使用
mousemove
的示例(我不知道您在谈论哪个Gamepad API):


您可以这样做,检查在1秒间隔内调用事件的频率,以及是否处理它。代码示例,我所想的大致轮廓(没有gaurantee(像那样的拼写))

函数过程\事件(){
var curr=new Date().getTime();
如果((curr-timeObj.last)<1000){//1秒
如果(时间对象计数器>25){
对于(变量x=0;x=1000){
时间对象时间拼接(x,1);
timeObj.counter-=1;
}
}
}
否则{
timeObj.counter+=1;
timeObj.times[timeObj.times.length()-1]=当前值;
}
}
否则{
timeObj.counter=0;
timeObj.times=[];
}
如果(时间对象计数器>25){
返回错误
}  
否则{
返回真值
} 
}

我确信这可能是一个更好的解决方案但不要相信我的话。lol。移动跟踪功能将是您希望每秒触发25次的功能

setInterval(movementTracking(),40)


阅读有关它的摘要->

您正在寻找的是所谓的节流。看一看这个问题:。这是一个简单的解决方案,但您可能会错过“最后一个”事件,这在某些场景中很重要。我认为您只会一遍又一遍地覆盖eventlistener,这似乎不是目标。您是对的Nico谢谢,我的意思是间歇性地调用该操作的函数
var lastMove = 0;
document.addEventListener('mousemove', function() {
    // do nothing if last move was less than 40 ms ago
    if(Date.now() - lastMove > 40) {
        // Do stuff
        lastMove = Date.now();
    } 
});
function process_event() {
var curr = new Date().getTime();
if ((curr - timeObj.last) < 1000) { //One Second 
     if (timeObj.counter > 25) {
        for (var x=0;x<timeObj.times;x++) {
             if ((curr - timeObj.times[x]) >= 1000) {
                   timeObj.times.splice(x, 1);
                   timeObj.counter -= 1;
             }
        }
     }
     else { 
         timeObj.counter += 1;
         timeObj.times[timeObj.times.length()-1] = curr;
     }
}
else {
    timeObj.counter = 0;
    timeObj.times = [];
}
if (timeObj.counter > 25) {
    return False
 }  
 else {
   return True
 } 
}