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;
/*Основной код процедуры*/
}
}
Храним историю необходимого количества операций. При каждой попытке вызова требуемой функции сравниваем текущее время с самой ранней из всех записей в данной истории, индекс которой на единицу больше текущей итерации.
Если в первом случае временные отрезки исчислялись последовательно без наложения и действительно возникала та ситуация, которую ты описал, то во втором примере подобного уже не должно быть.