ajax settimeout для обновления div - PullRequest
0 голосов
/ 26 октября 2011

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

Спасибо и всего наилучшего, 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:\n\n" + textStatus + "\n" + errorThrown);
    } else {
      setTimeout(ajax, 5000);
    }
  }
}

Ответы [ 2 ]

1 голос
/ 26 октября 2011

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

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

var t; //global

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

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

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

0 голосов
/ 01 ноября 2011

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

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

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

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

на

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

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

...