Переодическая работа функции
Здравствуйте господа!
есть функция: 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сек. |
var sec = -1; function em(e){ sec++; setTimeout(function(){ alert(e); setTimeout(function(){sec--;},1000); },sec*1000); } Может как-то так (на скорую руку). :) |
Херня какая-то)
|
Запускайте пример с включённой консолью.
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 секунд. Стек должен быть пуст Создаёт стек нужного размера, с заданными паузами между запуском вызовов функции. |
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) |
рони, спасибо! Реально помог! Карма+
|
Бля, короче мне надо вместо 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 |
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); |
Ок, спасибо)
|
Часовой пояс GMT +3, время: 05:01. |