Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.11.2013, 23:02
Интересующийся
Отправить личное сообщение для Nikola Flamel Посмотреть профиль Найти все сообщения от Nikola Flamel
 
Регистрация: 10.11.2013
Сообщений: 10

Декоратор с использованием 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 миллисекунд.
Заранее спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 15.11.2013, 03:20
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Странная штука. Зачем это в конечном счете нужно?
Ответить с цитированием
  #3 (permalink)  
Старый 15.11.2013, 04:15
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Nikola Flamel,
Создавать одновременно функцию и флаг=true (видимый в ней и конструкторе) который она сбрасывает по началу исполнения
При попытке создания новой функции - конструктор смотрит флаг
Ответить с цитированием
  #4 (permalink)  
Старый 15.11.2013, 17:38
Интересующийся
Отправить личное сообщение для Nikola Flamel Посмотреть профиль Найти все сообщения от Nikola Flamel
 
Регистрация: 10.11.2013
Сообщений: 10

Сообщение от Deff Посмотреть сообщение
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);
}

}

А вот дальше, как проверять создание новой функции, я не могу понять.
Ответить с цитированием
  #5 (permalink)  
Старый 15.11.2013, 18:42
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Как-то так, если я правильно понял.
Очень похоже на какой-то странный 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;
        }
    }
}

Последний раз редактировалось ixth, 15.11.2013 в 18:47.
Ответить с цитированием
  #6 (permalink)  
Старый 15.11.2013, 18:53
Интересующийся
Отправить личное сообщение для Nikola Flamel Посмотреть профиль Найти все сообщения от Nikola Flamel
 
Регистрация: 10.11.2013
Сообщений: 10

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
setTimeout и переход на новую страницу Kubik129 Общие вопросы Javascript 3 03.02.2012 18:21
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26
setTimeout Воитель Общие вопросы Javascript 5 23.01.2009 10:36