ajax settimeout для обновления div

#ajax #browser #crash #settimeout

#ajax #браузер #сбой #settimeout

Вопрос:

Я отображаю график с использованием jqPlot для мониторинга данных. Чтобы обновить div, содержащий график, я вызываю вызов ajax каждые 5 секунд (см. Выдержку из JavaScript ниже). На сервере PHP-скрипт извлекает данные из базы данных. В случае успеха вызов ajax повторно вызывается через 5 секунд с помощью JavaScript setTimeout(ajax, 5000). При ошибке вызов ajax повторяется 10 раз с помощью setTimeout(ajax, 5000) перед отображением сообщения об ошибке. Мониторинг XHR обнаруживает, что браузер выходит из строя примерно после 200 запросов. В качестве временного средства после 50 итераций выдается location.reload(), чтобы предотвратить сбой браузера. Это работает, но не является идеальной ситуацией. Любое лучшее решение этой проблемы очень ценится.

Спасибо и с уважением, JZB

 function ajax() {
  $.ajax({
    cache: false,
    url: 'monitor.php',
    data : { x: id },
    method: 'GET',
    dataType: 'json',
    success: onDataReceived,
    error: onDataError
  });

  function onDataReceived(series) {
    $('#chartdiv_bar').html('');
    $.jqplot('chartdiv_bar', [series['initHits']], CreateOptions(series,'Inits'));

    errorcount = 0;
    setTimeout(ajax, 5000);
  }

  function onDataError(jqXHR, textStatus, errorThrown) {
    errorcount  ;
    if (errorcount == 10) {
      alert("No server response:nn"   textStatus   "n"   errorThrown);
    } else {
      setTimeout(ajax, 5000);
    }
  }
}
  

Ответ №1:

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

возможно, вы захотите попытаться очистить текущий таймер, а затем запустить следующий таймер

 var t; //global
  

В каждой из ваших функций обратного вызова:

 if(t)      
 clearTimeout(t);
t = setTimeout(ajax, 5000);
  

больше информации о таймере здесь: школа w3

Комментарии:

1. Спасибо за совет. Использование clearTimeout, как предложено, не решает проблему. Мониторинг XHR по-прежнему показывает, что запросы накапливаются, пока браузер не выйдет из строя примерно при 200 запросах. Я считаю, что это запросы ajax, а не запросы таймера, и я не могу придумать другого способа, кроме перезагрузки страницы, чтобы очистить их. Опять же, предложения по решению очень ценятся.

2. о, извините, это не сработало. Вы пытались удалить вызов jqplot из своего кода. Возможно, вместо этого используйте инструкцию alert. просто чтобы исключить проблему с jqplot.

Ответ №2:

Я удалил вызов jqplot, как было предложено, и проблема исчезла.

По-видимому, виновником является jqplot, и я нашел множество записей, относящихся к утечкам памяти jqPlot.
Я использую jQuery 1.6.4 и установил диаграммы jqPlot версии 1.0.0b2_r792, которые предположительно устраняют проблемы с утечкой памяти.

Кроме того, я заменил

 $('#chartdiv_bar').html('');
  

с

 $('#chartdiv_bar').empty();
  

Спасибо за вашу поддержку.