Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.03.2015, 18:57
Интересующийся
Отправить личное сообщение для Basil_JS Посмотреть профиль Найти все сообщения от Basil_JS
 
Регистрация: 04.09.2014
Сообщений: 12

Ограничение на количество вызовов функции за время < 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++;
}
}

Благодарю заранее.
Ответить с цитированием
  #2 (permalink)  
Старый 20.03.2015, 12:00
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

Примерно так:
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;
	}
}
Ответить с цитированием
  #3 (permalink)  
Старый 20.03.2015, 14:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

demoniqus, неа. Если например 1 вызов будет на первой мс, затем 4 на десятой, потом 4 на первой и 1 на десятой, то получится 8 вызовов за 2 мс.) Тут надо хранить время последних четырёх вызовов и от него отталкиваться.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 20.03.2015, 15:03
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

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;
		
		/*Основной код процедуры*/
	}
}

Храним историю необходимого количества операций. При каждой попытке вызова требуемой функции сравниваем текущее время с самой ранней из всех записей в данной истории, индекс которой на единицу больше текущей итерации.
Если в первом случае временные отрезки исчислялись последовательно без наложения и действительно возникала та ситуация, которую ты описал, то во втором примере подобного уже не должно быть.
Ответить с цитированием
  #5 (permalink)  
Старый 20.03.2015, 16:19
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

уже придумано и отлажено

https://lodash.com/docs#debounce
https://lodash.com/docs#throttle
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 20.03.2015, 16:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

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;
    }
}
__________________
29375, 35

Последний раз редактировалось Aetae, 20.03.2015 в 17:33.
Ответить с цитированием
  #7 (permalink)  
Старый 20.03.2015, 20:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

мысли вслух -- не более 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>
Ответить с цитированием
  #8 (permalink)  
Старый 20.03.2015, 20:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Aetae
nerv_, прочитай внимательней условие.)
я его читал и ссылки не просто так постил)
http://learn.javascript.ru/play/uUXAV
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчитать количество вызовов функции внутри функции lohmatiy Javascript под браузер 4 24.02.2014 17:45
Поиск подходящей функции во время выполнения. Аналог getattr в Python NodeNerd Общие вопросы Javascript 2 23.10.2013 19:50
Position fixed, но динамический по оси ОХ tvixa Элементы интерфейса 4 09.09.2013 15:39
setTimeout время при очередном вызове функции ShutTap Элементы интерфейса 4 07.12.2012 00:17