以最小间隔触发javascript事件

| 我想在重复事件发生时(点击“保存”按钮)触发一个动作(如“更新已保存!”消息),但在给定的时间内不触发两次。 对于以下内容,我希望excecuteFunction()每3秒最多触发一次,但是如果setInterval在4.5秒后清除,我仍然希望它在6秒后再次触发。
var minimumTime = 3000; // minimum ms between events
function myTimedEvent() {
    if ( lessThanMinimumTime() )
        // loop through again
    else {
        executeFunction();
    }
}
window.setInterval(myTimedEvent, 500);
executeFunction()
可以在执行时创建一个时间戳,
lessThanMinimumTime()
可以将该时间戳与当前时间进行比较,然后设置一个子间隔,如果该间隔在最小时间范围之内,则由by1清除。 肯定有更好的办法。     
已邀请:
这将每三秒触发一次事件(加上执行executeFunction()所花费的时间),但是如果事件在最后三秒内触发,仍将调用executeFunction()。这是您要找的东西吗?
var minimumTime = 3000; // minimum ms between events
var lastFired = null;
var timer;
function myEventHandler(){
    var now = new Date().getTime();
    clearTimeout(timer);
    if(lessThanMinimumTime()){
        timer = setTimeout(myEventHandler, lastFired - now + minimumTime);
    } else {
        executeFunction();
        lastFired = now;
    }
}

function lessThanMinimumTime(){
    if(lastFired == null) return false;
    return lastFired > new Date().getTime() - minimumTime;
}
    
尝试这个:
Function.prototype.restrictCallsToInterval = function(sec){
    var self = this,
        last, queued, diff;

    return function(){
        var args = arguments;
        if(last && !queued && (diff = (new Date().getTime() - last + 1000*sec)) > 0){
            // queue this up
            queued = setTimeout(function(){
                self.apply(self, args);
            }, diff);

            return;
        }

        last = new Date().getTime();
        self.apply(self, args);
    }
};

function doSomething(x){
    console.log(x);
}

doSomething = doSomething.restrictCallsToInterval(3);
doSomething(22);
doSomething(23);
    
好吧,您要求“更好的方式”-我认为确实没有更好的方式,但这是我能想到的最简单的方式:
var minimumTime = 3000; // minimum ms between events
var canFireEvent = true;
function myTimedEvent() {
    if (canFireEvent) {
        canFireEvent = false;
        window.setTimeout(function() {
            canFireEvent = true;
        }, minimumTime);
        executeFunction();
    }
}
使用一个布尔标志。没有混乱的日期。 概念证明。 (尽管计时器间隔为1秒,但每3秒执行一次功能)     

要回复问题请先登录注册