Декоратор с использованием 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 миллисекунд. Заранее спасибо. |
Странная штука. Зачем это в конечном счете нужно?
|
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); } } А вот дальше, как проверять создание новой функции, я не могу понять. |
Как-то так, если я правильно понял.
Очень похоже на какой-то странный 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; } } } |
Да, оно только в начале timeElapsed должен быть true. Спасибо большое)
|
Часовой пояс GMT +3, время: 22:43. |