Показать сообщение отдельно
  #4 (permalink)  
Старый 15.12.2012, 14:51
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 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; Устранил дублирование кода.
Ответить с цитированием