2015-07-22 2 views
0

В настоящее время я пытаюсь построить линейную диаграмму с использованием D3, которая загружает свои данные с сервера Elasticsearch и, когда почищается, повторно загружает данные в соответствии с новыми границами на x -ось. Это было реализовано, но поскольку код JavaScript загружает и повторно загружает данные с использованием запросов AJAX (через jQuery), старые запросы AJAX хранятся и их память не освобождается (как видно в инспекторе браузера). Это может быть из-за внутренних ссылок браузера на объекты XHR, создаваемые вызовами AJAX, но я не уверен. Ниже приведена одна из функций, выполняющих запрос (в конечном итоге она вызывает функцию обратного вызова minMaxLoaded, в которой выполняется выполнение, которое использует данные). Я пробовал много тактик, таких как сохранение вызовов AJAX в переменных и последующая установка их в null, .. но безрезультатно насколько я знаю, так как это все, завернутые в функции, ссылки на JavaScript должны исчезнуть после завершения функции и запросы должны быть мусора во всяком случае, здесь вы идете:AJAX призывает к экранированию объектов, вызвавших утечку памяти объектов XHR

function queryMinMax(domain, index) { 
    var absMin; 
    var absMax; 

    var minmaxQuery = { 
     "aggregations" : { 
      "minTime" : { 
       "top_hits" : { 
        "size" : 1, 
        "sort" : [ { "timestamp" : { "order" : "asc" } } ] 
       } 
      }, 
      "maxTime" : { 
       "top_hits" : { 
        "size" : 1, 
        "sort" : [ { "timestamp" : { "order" : "desc" } } ] 
       } 
      } 
     } 
    }; 

    $.ajax({ 
     url: domain + index + "/_search?search_type=count", 
     type: "POST", 
     dataType: "json", 
     data: JSON.stringify(minmaxQuery), 

     success: function(response) { 
      absMin = parseDate(response.aggregations.minTime.hits.hits[0]._source["timestamp"]).getTime(); 
      absMax = parseDate(response.aggregations.maxTime.hits.hits[0]._source["timestamp"]).getTime(); 
      minMaxLoaded(absMin, absMax); 
     } 
    }); 
} 

Спасибо за любую помощь!

+0

Вы пытались вызывать 'abort()' для объекта ajax, возвращающегося из вызова '$ ajax', перед созданием нового (вместо того, чтобы просто установить ссылку на null)? – Val

+0

Это ничего не меняет. Возможно ли, что сохранение ответов - это всего лишь функция веб-консоли Safari? Когда я закрываю веб-консоль, делаю несколько запросов и снова открываю их, ответы не уходят. – kgrimes2

+0

Что заставляет вас думать, что есть утечки памяти? Вы проверили свою память и заметили, что она продолжает расти, или это просто чувство? Боюсь, во всех случаях это не так много связано с Elasticsearch. – Val

ответ

0

Кажется, что веб-консоль Safari отслеживает ответы, которые выполняются во время ее открытия. Причина, из-за которой время обработки замедлилось, было из-за этого. он закрыт, консоль закрыта, вопрос ушел.

Смежные вопросы