Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переодическая работа функции (https://javascript.ru/forum/misc/33941-pereodicheskaya-rabota-funkcii.html)

adik7960 14.12.2012 18:11

Переодическая работа функции
 
Здравствуйте господа!
есть функция:
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сек.

ruslan_mart 14.12.2012 18:36

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


Может как-то так (на скорую руку). :)

adik7960 15.12.2012 13:39

Херня какая-то)

GuardCat 15.12.2012 14:51

Запускайте пример с включённой консолью.
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 секунд. Стек должен быть пуст


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

рони 15.12.2012 15:18

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)

adik7960 15.12.2012 17:13

рони, спасибо! Реально помог! Карма+

adik7960 15.12.2012 17:23

Бля, короче мне надо вместо 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

рони 15.12.2012 17:35

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);

adik7960 16.12.2012 11:13

Ок, спасибо)


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