Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Декоратор с использованием setTimeout (https://javascript.ru/forum/misc/42944-dekorator-s-ispolzovaniem-settimeout.html)

Nikola Flamel 14.11.2013 23:02

Декоратор с использованием setTimeout
 
Здравствуйте.
Есть декоратор limited который принимает в качестве аргументов time и func (время выполнения функции, сама функция). Так же декоратор запоминает переменные this и arguments, выполняет функцию через 20 милисекунд с этими переменными.

function limited(time,func){

var newThis=this;
var newArguments=arguments;

if(typeof time === 'function'){
func=time;
time=20;
}

return function(){
setTimeout(func,time);
}

}



Вопрос такой :
Как сделать так, что если во время того как истекает 20 миллисекунд функцию вызывают ещё раз, то мы не начинаем отсчитывать время заново, а просто меняем запомненные this и arguments. Если же время истекло, и функцию снова вызывают, то мы заново запоминаем новые значения this и arguments и заводим счётчик на 20 миллисекунд.
Заранее спасибо.

ixth 15.11.2013 03:20

Странная штука. Зачем это в конечном счете нужно?

Deff 15.11.2013 04:15

Nikola Flamel,
Создавать одновременно функцию и флаг=true (видимый в ней и конструкторе) который она сбрасывает по началу исполнения
При попытке создания новой функции - конструктор смотрит флаг

Nikola Flamel 15.11.2013 17:38

Цитата:

Сообщение от Deff (Сообщение 281203)
Nikola Flamel,
Создавать одновременно функцию и флаг=true (видимый в ней и конструкторе) который она сбрасывает по началу исполнения
При попытке создания новой функции - конструктор смотрит флаг

Спасибо, но , кое что, не понятно

function limited(time,func){
var newThis=this;
var newArguments=arguments;
var flag;

if(typeof time==='function'){
func=time;
time=20;
}



return function(){
flag=true; //создаем вместе с функцией
setTimeout(function(){
flag=false; //сбрасываем по началу работы функции
func.apply(newThis,newArguments);
},time);
}

}

А вот дальше, как проверять создание новой функции, я не могу понять.

ixth 15.11.2013 18:42

Как-то так, если я правильно понял.
Очень похоже на какой-то странный debouncing/throttling. Так зачем это?

function limited(time, func) {
    if (typeof time === 'function') {
        func = time;
        time = 20;
    }

    var newThis = this;
    var newArguments = arguments;
    var timeElapsed = true;

    return function () {
        if (timeElapsed) {
            timeElapsed = false;
            setTimeout(function () {
                timeElapsed = true; // сбрасываем по началу работы функции
                func.apply(newThis, newArguments);
            }, time);
        } else {
            newThis = this;
            newArguments = arguments;
        }
    }
}

Nikola Flamel 15.11.2013 18:53

Да, оно только в начале timeElapsed должен быть true. Спасибо большое)


Часовой пояс GMT +3, время: 22:43.