Инициировать события JavaScript с минимальным интервалом - PullRequest
2 голосов
/ 14 апреля 2011

Я хочу инициировать действие (например, сообщение «Обновление сохранено!») Всякий раз, когда происходит повторное событие (нажатие кнопки «Сохранить»), но не запускать его дважды в течение заданного периода времени.

В дальнейшем я хочу, чтобы 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() может сравнить эту временную метку с текущим временем, а затем установить подинтервал, который затем очищается на executeFunction(), если он находится внутри минимального временного диапазона.

Должен быть лучший способ.

Ответы [ 3 ]

0 голосов
/ 14 апреля 2011

попробуйте это:

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);
0 голосов
/ 14 апреля 2011

Ну, вы спросили "лучший путь" - я не думаю, что действительно есть какой-то лучший способ, но это самый простой способ, который я могу придумать:

var minimumTime = 3000; // minimum ms between events
var canFireEvent = true;
function myTimedEvent() {
    if (canFireEvent) {
        canFireEvent = false;
        window.setTimeout(function() {
            canFireEvent = true;
        }, minimumTime);
        executeFunction();
    }
}

Использование одного единственного логического флага.Не связывайтесь с датами.

Подтверждение концепции .
(Функция выполняется каждые 3 секунды, хотя интервал таймера составляет 1 секунду)

0 голосов
/ 14 апреля 2011

Это будет вызывать событие не чаще, чем раз в три секунды (плюс время, необходимое для выполнения 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...