Показать сообщение отдельно
  #4 (permalink)  
Старый 02.07.2016, 19:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

innowed,
function callWrap(f, count){
  var now, calls;
  return function(){
      if(!now||Date.now()- now > 1000) {now = Date.now();calls = 0};
      while(Date.now()-now < 1000 && calls<count){ //вызывать функцию не чаще чем count раз в секунду
        f.apply(this, arguments);
        calls++;
      }
  };
}

//"медленная" функция
var arr = [];
for (var i = 0; i < 1000; i++) arr[i] = 0;
function walkLength(arr) {
  for (var i = 0; i < arr.length; i++) arr[i]++;
  console.log('done');
}

var test = callWrap(walkLength, 7000); //обёртываем функцию в декоратор
test(arr);
test(arr); //тут  запуска не будет; секунда ещё не прошла но запущено 7000 функций
window.setTimeout(function() {
test(arr);
},15000)
test(arr);

Последний раз редактировалось рони, 02.07.2016 в 19:29.
Ответить с цитированием