Для проблемы нужны семафоры. Я делаю это много для отправки ajax после завершения предыдущего. Ваш случай немного похож;)
Попробуйте что-нибудь подобное. Он должен игнорировать все попытки уменьшить время, которые сталкиваются с обратным вызовом ajax.
window.TimeKeeper = new function(){
this.time=0; //initial value, whatever
this.isopen=true;
this.decrement = function(){
if(this.isopen){
this.time--;
redisplay(this.time);
}
}
this.set = function(val){
if(this.isopen){
this.isopen=false;
this.time=val;
this.isopen=true;
} else {
//another AJAX callback is modifying time.
//You can enqueue current value and put it later
}
}
}
function tick() {
TimeKeeper.decrement();
};
function update(newtime) {
TimeKeeper.set(newtime);
};
Еще одна вещь - setTimeout работает как новый поток, и я ожидаю, что браузеры выполняют синхронизирующий доступ к памяти, поэтому может быть достаточно проверить, не увеличивалось ли значение перед уменьшением. Но вышеприведенное решение является более гибким и безопасным.
И один маленький совет - избегайте слишком частых запросов к AJAX - это может вызвать дополнительные проблемы - например, запросы возвращаются в другом порядке, нежели отправленные, и использование памяти Firefox слишком сильно увеличивает количество ajax в минуту;)