Ограничение на количество вызовов функции за время < 10мс
Здравствуйте! Очень нужна помощь.
Есть функция, которая, так получилось, вызывается очень часто за короткий промежуток времени. Нужно сделать так, чтобы количество её вызовов не превышало 5 за 10мс. Сама функция: function game(i,j) { if (self.X[i] === self.X1[j] && (self.Y[i] === self.Y1[j] + 1 || self.Y[i] === self.Y1[j] - 1)) { //console.log('Игра'); cell_game++; } else if (self.X[i] === self.X1[j] - 1 && (self.Y[i] === self.Y1[j] || self.Y[i] === self.Y1[j] + 1 || self.Y[i] === self.Y1[j] - 1)) { //console.log('Игра'); cell_game++; } else if (self.X[i] === self.X1[j]+1 && (self.Y[i] === self.Y1[j] || self.Y[i] === self.Y1[j] + 1 || self.Y[i] === self.Y1[j] - 1 )) { //console.log('Игра'); cell_game++; } } Благодарю заранее. |
Примерно так:
runsCounter = 0; lastTime = (new Date()).getTime(); function game(){ if ((new Date()).getTime() - lastTime <= 10) { ++runsCounter;/*Увеличиваем счетчик исполнений*/ if (runsCounter < 6) { /*Здесь ты можешь выполнять свой код*/ } } else { /*Начался новый интервал времени, поэтому все переменные выставляем в дефолт*/ lastTime = (new Date()).getTime(); runsCounter = 0; } } |
demoniqus, неа. Если например 1 вызов будет на первой мс, затем 4 на десятой, потом 4 на первой и 1 на десятой, то получится 8 вызовов за 2 мс.) Тут надо хранить время последних четырёх вызовов и от него отталкиваться.
|
Aetae, какая хитропопая трактовка))))))))))) Я о таком варианте не думал как-то...
Тогда примерно так: nowIteration = 0; iterationLimit = 5; timeLimit = 10; historyTimes = {}; for (var i = 0; i < iterationLimit; ++i) { historyTimes[i] = (new Date()).getTime(); } function game(){ var t = (new Date()).getTime(); /*Следующая итерация является самой старой по отношению к текущей, поэтому сравниваем с ее временем*/ nextIteration = nowIteration + 1; nextIteration >= iterationLimit && (nextIteration = 0); if (t - historyTimes[nextIteration] > timeLimit) { historyTimes[nowIteration] = t; nowIteration = nextIteration; /*Основной код процедуры*/ } } Храним историю необходимого количества операций. При каждой попытке вызова требуемой функции сравниваем текущее время с самой ранней из всех записей в данной истории, индекс которой на единицу больше текущей итерации. Если в первом случае временные отрезки исчислялись последовательно без наложения и действительно возникала та ситуация, которую ты описал, то во втором примере подобного уже не должно быть. |
|
nerv_, прочитай внимательней условие.)
Яб написал примерно так: game = limit(game, 5, 10) function limit(func, count, time){ var result, array = new Array(count); return function(){ if(time > new Date() - array[0]) return result; //возвращаем результат последнего вызова result = func.apply(this, arguments); //исполняем функцию в текущем контексте с нужными аргументами array.shift(); array.push(new Date()); return result; } } |
:write: мысли вслух -- не более 3 кликов за 5 сек
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> </head> <body> <input name="" type="button" value="test" onclick="game(this)"> <script> var counter = 3, time = 5000, temp = [], n = 0; function game(obj) { temp.push((new Date()).getTime()); var ok = limit(temp, time) obj.style.backgroundColor = ok ? "lime" : "red" n += +ok; obj.value = n; } function limit(arr, time) { var sum = 0; for (var i = arr.length - 1, a, b; a = arr[i--];) { b = arr[i]; b && (sum += (a - b)); sum > time && (arr.splice(0, i + 1)) }; var ok = sum > time || arr.length <= counter; !ok && arr.pop(); return ok } </script> </body> </html> |
Цитата:
http://learn.javascript.ru/play/uUXAV |
Часовой пояс GMT +3, время: 23:46. |