Запускайте пример с включённой консолью.
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 секунд. Стек должен быть пуст
Создаёт стек нужного размера, с заданными паузами между запуском вызовов функции.