Повторяющиеся запросы AJAX замедляют браузер

Существует небольшая веб-страница, которая запрашивает XML-файл с веб-сервера. Веб-сервер обновляет этот файл дважды в секунду, добавляя новые данные для отображения на веб-странице.

После того, как страница останется запущенной на некоторое время, она будет замедлять работу всего браузера всякий раз, когда получает новые данные с сервера (дважды в секунду). Проблема носит периодический характер - иногда длится несколько секунд, иногда дольше.

Проблема существует в Firefox.

function getData() {
  var dataVal = parseFloat($("#data").html().substring(0, 100));
  doSomethingWithVal(XTEval); // seemingly irrelevant, as it lags without this function too
}

t = 0.5;

function process_xml() {
  var xmlhttp = GetXmlHttpObject();

  if (xmlhttp === null) {
    alert("Your browser does not support AJAX!");
    return;
  }

  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState === 4) {
      document.getElementById("data").innerHTML = xmlhttp.responseText;
      getData();
      setTimeout('process_xml()', t * 1000);  // moved from end of function to here based on a suggestion
    }
  };
  xmlhttp.open("GET", "data.shtml", true);
  xmlhttp.send("");
}

function GetXmlHttpObject() {
  if (window.XMLHttpRequest)
    return new XMLHttpRequest();
  if (window.ActiveXObject)
    return new ActiveXObject("Microsoft.XMLHTTP");
  return null;
}

data.shtml просто содержит:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<!--#echo var="someVal.val" -->

Возможно, есть другой/лучший подход, чем использование AJAX?


person Daniel T    schedule 02.12.2014    source источник
comment
Было бы неплохо объявить переменную xmlhttp с помощью var в этой функции. Без этого это глобальная переменная, и последующие вызовы process_xml перезаписывают ее предыдущее значение.   -  person Pointy    schedule 02.12.2014
comment
Благодарю вас! Я этого не знал, и я сделал это изменение. Я унаследовал этот код и постепенно обновлял его.   -  person Daniel T    schedule 02.12.2014
comment
Я прав, что в вашем коде нет getData и getXTE не вызывается из process_xml? Можете ли вы подтвердить это или исправить свой пример (который может включать исправление XTEVal и dataVal)   -  person rene    schedule 02.12.2014
comment
@rene Спасибо, что поймали это. В моем реальном коде вместо getData вызывается getXTE. Я упрощал код для SO и забыл изменить функцию getXTE на getData.   -  person Daniel T    schedule 03.12.2014
comment
Блокировка сеанса с одновременными вызовами ajax в php — известная проблема, не уверен, что это будет то же самое с SSI.   -  person i--    schedule 03.12.2014


Ответы (1)


Я не знаю, в чем проблема, но если обращение к серверу, плюс парсинг и все остальное, что вы делаете в process_xml, занимает более 500 мс, то вы получите несколько запросов в полете на в то же время, что в конечном итоге приведет к засорению каналов (у браузеров есть ограничение на то, сколько они могут обрабатывать одновременно). Вам лучше вызвать setTimeout в обработчике onreadystatechanged после того, как вся работа там будет завершена.

person Paul    schedule 02.12.2014
comment
Я сделал изменение, но нет сигары. Он все еще замедляется после работы в течение минуты или около того. - person Daniel T; 03.12.2014
comment
Проблема только в FireFox или во всех браузерах? - person Paul; 03.12.2014
comment
Похоже, Chrome не пострадал. Однако трудно сказать наверняка, потому что проблема носит спорадический характер. - person Daniel T; 03.12.2014