Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.12.2012, 18:11
Аспирант
Посмотреть профиль Найти все сообщения от adik7960
 
Регистрация: 11.03.2012
Сообщений: 58

Переодическая работа функции
Здравствуйте господа!
есть функция:
function em(e) {
  alert(e);
}

эта функция может быть вызвана 500 раз в секунду,
а мне надо как бы поставить ограничитель и очередь
как бы если я вызвал эту функцию 2 раз, то она обработает мой первый раз а через 1сек обратотает второй раз, т.к я вызвал её 2 раза

Но если я вызываю эту функци 3 раза, то второй раз какбы должен замениться третьим и получается что второй раз проигнорирован
если кто не понил вот код:
function em(e) {
  alert(e);
}
// пример
em(1);//функция сработает без задержки в 1сек.
em(2);//выполнится но только после того как пройдет 1сек.
// пример с игнором
em(1);//функция сработает без задержки в 1сек.
em(2);// не выполнится по причине замены строкой ниже
em(3);//выполнится но только после того как пройдет 1сек.
Ответить с цитированием
  #2 (permalink)  
Старый 14.12.2012, 18:36
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

var sec = -1;
function em(e){
sec++;
setTimeout(function(){
alert(e);
setTimeout(function(){sec--;},1000);
},sec*1000);
}


Может как-то так (на скорую руку).
Ответить с цитированием
  #3 (permalink)  
Старый 15.12.2012, 13:39
Аспирант
Посмотреть профиль Найти все сообщения от adik7960
 
Регистрация: 11.03.2012
Сообщений: 58

Херня какая-то)
Ответить с цитированием
  #4 (permalink)  
Старый 15.12.2012, 14:51
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

Запускайте пример с включённой консолью.
makeStack = function(func, timeout, maxStackSize) {
  var 
    stack = [ ],
    lastStartDateTime = 0
  ;
  
  return function() {
    if (new Date() - lastStartDateTime >= timeout && stack.length === 0) {
      func.apply(null, Array.prototype.slice.call(arguments) );
      lastStartDateTime = new Date;

    } else {
      if (stack.length >= maxStackSize) { 
        stack.pop();
      } else {
        setTimeout( function() { lastStartDate = new Date; (stack.shift())() }, timeout * ( stack.length + 1 ) )
      }
      stack.push( function(args) { func.apply(null, Array.prototype.slice.call(args) ) }.bind(null, arguments) );
    }
  }
}

// Протестируем
function test(a, b) {
  console.log( new Date )
  console.log(a,b)
}

var stack1 = makeStack(test, 1000, 3);

stack1("1", "2")  //Это исполнится сразу и в стек не попадёт
stack1("3", "4")
stack1("5", "6")
stack1("7", "8") // А это не сработает, поскольку следующий вызов превысит размер стека и заменит этот вызов собой.
stack1("9", "10")
  
setTimeout( function(){
  stack1("1", "2")
  stack1("3", "4")
  stack1("5", "6")
  stack1("7", "8") // А это не сработает, поскольку следующий вызов превысит размер стека и заменит этот вызов собой.
  stack1("9", "10")
}, 5000 ) // Повторим через 5 секунд. Стек должен быть пуст


Создаёт стек нужного размера, с заданными паузами между запуском вызовов функции.

Последний раз редактировалось GuardCat, 15.12.2012 в 16:40. Причина: Заменил обёртку на .bind; Устранил дублирование кода.
Ответить с цитированием
  #5 (permalink)  
Старый 15.12.2012, 15:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

adik7960,
Вариант...для наглядности задержка 5сек
var timerId, n, flag;
function em(a) {
    flag ? n = a : (alert(a), n = !1, flag = !0,
        timerId = setTimeout(function () {
        flag = !1;
        n && em(n)
    }, 5000))
};
em(1);//функция сработает без задержки в 5сек.
em(2);//выполнится но только после того как пройдет 5сек.
// пример с игнором setTimeout для того чтобы не дублировать код выше
setTimeout(function () {
       em(1);//функция сработает без задержки в 5сек.
       em(2);// не выполнится по причине замены строкой ниже
       em(3);//выполнится но только после того как пройдет 5сек.
    }, 15000)

Последний раз редактировалось рони, 15.12.2012 в 16:28.
Ответить с цитированием
  #6 (permalink)  
Старый 15.12.2012, 17:13
Аспирант
Посмотреть профиль Найти все сообщения от adik7960
 
Регистрация: 11.03.2012
Сообщений: 58

рони, спасибо! Реально помог! Карма+
Ответить с цитированием
  #7 (permalink)  
Старый 15.12.2012, 17:23
Аспирант
Посмотреть профиль Найти все сообщения от adik7960
 
Регистрация: 11.03.2012
Сообщений: 58

Бля, короче мне надо вместо alert(e); вставить длинный код
и я так попробовал
var r = function() {///////код//////};
var timerId, n, flag;
function em(a) {
    flag ? n = a : (r, n = !1, flag = !0,
        timerId = setTimeout(function () {
        flag = !1;
        n && r(n)
    }, 1000))
};

так вот долго думая комп выдал это: Uncaught ReferenceError: a is not defined
Ответить с цитированием
  #8 (permalink)  
Старый 15.12.2012, 17:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

adik7960,
var timerId, n, flag,
r = function(a) {alert(a)};
function em(a) {
    flag ? n = a : (r(a), n = !1, flag = !0,
        timerId = setTimeout(function () {
        flag = !1;
        n && em(n)
    }, 5000))
};
em(1);
em(2);
Ответить с цитированием
  #9 (permalink)  
Старый 16.12.2012, 11:13
Аспирант
Посмотреть профиль Найти все сообщения от adik7960
 
Регистрация: 11.03.2012
Сообщений: 58

Ок, спасибо)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 10:09
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
динамическое содержимое функции alfmaster Общие вопросы Javascript 2 28.05.2011 17:10
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03