Семафоров или критических секций нет, потому что JavaScript однопоточный. Вызов ajax является асинхронным, поэтому он запускает запрос, а затем с радостью продолжает работу и покидает ваш критический раздел. Как уже упоминалось, простое решение состоит в том, чтобы сделать запрос синхронным, но это противоречит цели ajax.
Глядя на свой код, кажется, что вы пытаетесь получать обновления через регулярные промежутки времени. Если это так, почему бы не запланировать следующее обновление в обратном вызове запроса ajax?
this.getMessages = function (){
var url="getmessages.php?lastindex="+this.lastindex;
$.getJSON(url,
function(data){
gup.lastindex=data.lastindex;
$.each(data.updates, function(i,item){
gup.addUpdate(item);
});
gup.updateTimer=setTimeout(gup.getMessages, 30);
}
);
}
Это устранит необходимость в семафорах и больше соответствует управляемой событиями природе JavaScript. Недостатком является то, что обновления не выполняются с точными интервалами. Кроме того, 30 миллисекунд кажется чрезвычайно коротким интервалом.