Декоратор с использованием 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, время: 16:17. |