14.12.2012, 18:11
|
Аспирант
|
|
Регистрация: 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сек.
|
|
14.12.2012, 18:36
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
var sec = -1;
function em(e){
sec++;
setTimeout(function(){
alert(e);
setTimeout(function(){sec--;},1000);
},sec*1000);
}
Может как-то так (на скорую руку).
|
|
15.12.2012, 13:39
|
Аспирант
|
|
Регистрация: 11.03.2012
Сообщений: 58
|
|
Херня какая-то)
|
|
15.12.2012, 14:51
|
|
Просто любитель
|
|
Регистрация: 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; Устранил дублирование кода.
|
|
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.
|
|
15.12.2012, 17:13
|
Аспирант
|
|
Регистрация: 11.03.2012
Сообщений: 58
|
|
рони, спасибо! Реально помог! Карма+
|
|
15.12.2012, 17:23
|
Аспирант
|
|
Регистрация: 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
|
|
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);
|
|
16.12.2012, 11:13
|
Аспирант
|
|
Регистрация: 11.03.2012
Сообщений: 58
|
|
Ок, спасибо)
|
|
|
|