[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ajax
Shturman
Здравствуйте!
Суть проблемы:
Я написал чат с MySQL и решил прикрутить ему автообновление, но чтобы избежать многих проблем с перезагрузкой страницы, осуществил это через Ajax. Но у чата 2 обновляемых поля:
1. Собственно, поле для общения.
2. Список юзеров, кто сейчас он-лайн.

Для более-менее живой беседы период обновления задан 15 секунд. С каждым обновлением полей юзер обновляет в базе время своего посещения.
Юзеры, которые за 30 секунд не обновились из списка он-лайн исключаются.

Так вот, для обновления посылается XMLHttpRequest. По изменению его статуса вызывается функция, меняющая содержимое поля.
А вот тут и возникает проблема - время выполнения запроса всегда разное и иногда результат появляется не в том окне, в котором должен...

Подскажите, как можно сделать так, чтобы каждый последующий вызов функции производился только после полного завершения предыдущего?



Спустя 11 минут, 37 секунд (21.09.2009 - 10:15) Nikitian написал(а):
Ставьте какой-нибудь флаг и функция обновления будет выглядеть примерно так:
HTML
var flag=false;
function reload()
{
if(flag)return false;
flag=true;
//Здесь делаем запросы и всё, что надо
flag=false;
}

Спустя 6 минут (21.09.2009 - 10:21) Shturman написал(а):
Ставлю, только все несколько сложнее...
Код

function RefreshWindow(ready, data){
if(chek==0){
 if(ready==4){
  chek++;
  document.getElementById("smiles").innerHTML=data;
  SendRequest("./window.php", "name="+Username, "POST");
 }
}else if(chek==1){
 if(step==1)
 document.getElementById("window").innerHTML=data;
 if(ready==4){
  document.getElementById("window").innerHTML=data;
  chek++;
  SendRequest("./online.php", "name="+Username, "POST");
 }
}else {
 if(step==1)
 document.getElementById("on-line").innerHTML=data;
 if(ready==4){
  document.getElementById("on-line").innerHTML=data;
  chek=1;
  step++;
 }
}
}

step - это мой выпендреж! Отвечает за то, чтобы только при первой загрузке появлялась надпись "Loading...", а также только при первом шаге отрисовываются смайлики.
chek - как-раз и определяет, какое окно должно обновиться.
Процесс обновления запускается так:
Код

setInterval('SendRequest("./window.php", "name="+Username, "POST")', 15000);

и иногда обновление "on-line" не успевает произойти, а уже вызывается SendRequest("./window.php"... В результате, в окне "on-line" появляется клон основного поля...

Спустя 54 секунды (21.09.2009 - 10:22) Michael написал(а):
Цитата (Shturman @ 21.09.2009 - 07:03)
Подскажите, как можно сделать так, чтобы каждый последующий вызов функции производился только после полного завершения предыдущего?

Можно сделать объект XMLHttpRequest единственным и запросы к нему организовать в очередь.
30 секунд - не маловато? Или для трех человек?

Спустя 1 минута, 17 секунд (21.09.2009 - 10:23) Shturman написал(а):
30 секунд - многовато. Это ж не форум...
Как саму очередь организовать? - вот чего не пойму...
Кстати, объект и так единственный.

Была мысль сделать XMLHttpRequest классом, но ведь он не может параллельный запрос послать, правильно?

Спустя 6 минут, 35 секунд (21.09.2009 - 10:30) Michael написал(а):
1) Нужно создать массив
2) при необходимости запроса к XMLHttpRequest
запрос заносится в массив и ФУНКЦИЯ 3)
3) если XMLHttpRequest готов к работе - вынимаем
из очереди задание
4) по окончании отработки XMLHttpRequest проверяем
очередь и если не пуста - берем следующее задание.

Помещать и вынимать из массива - лучшефункции
очереди в JS: push, shift.

Спустя 45 секунд (21.09.2009 - 10:31) Shturman написал(а):
ОК! Спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.