@arcanrun

В чем ошибка при реализации Comet (Long — Polling) метода?

Проблема заключается том, что функция срабатывает через каждую, примерно, 0.1 секунду, и совсем не реагирует на изменение значения timeout. Прошу подсказать в чем ошибка.
На стороне клиента создается функция:

function getmess(){
$.ajax({
url:"get_mess.php",
data:{"id":id},
type:"POST",
timeout: 100000,
complete:getmess,
success:function(result){
$("#response").html(result);
}
});
}

На сервере цикл:

while (true) {
$res = mysql_query('SELECT * FROM saymon WHERE id>$_POST['id']');
if (mysql_num_rows($res)) {
while ($item=mysql_fetch_array($res)) {

echo $item['mess']."";
}
flush();
exit;
}
sleep(5);
}
  • Вопрос задан
  • 3845 просмотров
Решения вопроса 1
Не понятно, что Вам надо.
1. Ждать 100000мс ответ сервера и если он не ответил, то заново отправлять запрос
или
2. Отправлять запрос с задержкой в 100000мс после получения предыдущего ответа?

В первом случае js работает нормально - проверил.

Возможно php не правильно отрабатывает и отдает Вам ответ в течении 0.1c. Выведите логирование, повыводите echo с разных условий.

Во втором, надо немного переписать код:
function getmess(){
	$.ajax({
		url:"get_mess.php",
		data:{"id":id},
		type:"GET",
		success:function(result){
			$("#response").html(result);
			setTimeout('getmess',100000);
		}
	});
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AlexPTS
@AlexPTS
Full stack веб разработчик
По поводу механики на клиенте Serkaz все верно написал.

Если опустить время на запросы, то через setInterval() можно равномерно эту функцию вызывать.

А проблема была в
complete:getmess

На событие comolete запроса вы следом же снова эту функцию вызывали. Отсюда и интервал 0,1 сек был
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы