Проблема с длинным запросом на опрос jquery php

Я создаю чат, основанный на длительном опросе (что-то вроде это) с PHP и jQuery. как только вся страница загружается в браузер, функция делает длинный запрос на сервер с некоторым ограничением времени ожидания, когда данные поступают из сервера, она снова делает запрос на длинный опрос, и если какая-либо ошибка, она снова делает новый долгий опрос.

Проблема: анализируя трассировки с помощью firebug, я заметил, что иногда длинный запрос на опрос выполняется 3 или 4 раза, однако этого не должно быть. на странице должен выполняться только один запрос на длительный опрос.

однако код работает отлично. но проблема заключается в дублировании запроса на длительный опрос.

function listen_for_message(){ 
// this functions is makes the long-polling request
$.ajax({
  url: "listen.php",
  timeout:5000,
  success: function(data) {
            $('#display').html(data);
            listen_for_message();
             }
  error: function() {
            setTimeOut("listen_for_message()",2000); // if error then call the function after 2 sec
  }
    });
    return;
}

person Bhavesh G    schedule 13.01.2012    source источник
comment
Пожалуйста, не могли бы вы опубликовать свой код, который инициирует длинный опрос?   -  person jabclab    schedule 13.01.2012
comment
отредактировал вопрос, в него включен код.   -  person Bhavesh G    schedule 13.01.2012


Ответы (1)


Попробуйте завершить запросы вручную:

var connection;
function longpoll() {
   if(connection != undefined) {
      connection.abort();
   }

   connection = $.ajax({ 
       ...
       complete: function() {
          longpool();
       }
   });
}

Это также может быть проблема с Firefox/firebug (отображение прерванных подключений как запущенных), проверьте это в Chrome.

ОБНОВИТЬ:

«Только в Firefox 3.0+ запросы сценариев и JSONP не могут быть отменены по тайм-ауту; скрипт будет работать, даже если он прибудет после периода ожидания». http://api.jquery.com/jQuery.ajax/

person Konrad Dzwinel    schedule 13.01.2012
comment
Есть ли способ сделать в коде такой, чтобы код проверял, что если выполняется запрос, функция будет возвращена, иначе функция будет вызвана? - person Bhavesh G; 13.01.2012
comment
Вы можете использовать переменную connection в качестве флага, чтобы проверить, выполняется ли какой-либо запрос ajax, и, если это так, не разрешать создавать новый. Просто установите connection = undefined; в функции complete и return в начале функции longpoll, если connection != undefined. - person Konrad Dzwinel; 13.01.2012
comment
Да, ты прав. это проблема firebug/firefox, chrome не показывает несколько ожидающих запросов. спасибо за ваше предложение. сэкономил мое время :) - person Bhavesh G; 13.01.2012