Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2017, 18:52
Кандидат Javascript-наук
Отправить личное сообщение для biryukovm Посмотреть профиль Найти все сообщения от biryukovm
 
Регистрация: 13.12.2013
Сообщений: 110

Частая загрузка XML не нагружая память
Привет всем. Я в интернете много почитал библиотеки и немного не понимаю некоторых моментов.
У меня есть скрипт который ображается к URL (моему) и получаю файл в виде XML формата и проблема такая что грузится память хотя я все вродебы чищу или нет не пойму. Подскажите как правильно мне его составить , вот 2 образца что я нашел они оба работают но память забивается.
Я обращаюсь к скрипту с переодичностью 3 сикунды, но хотелось бы быстрее.


Пример 1
setInterval(lin, 3000);
function lin() {
    var request;
    if(window.XMLHttpRequest){request = new XMLHttpRequest();}else{request = new ActiveXObject("Microsoft.XMLHTTP");}
    request.open('GET','/infoxml', true);
    //request.open('GET', '/infoxml' + Math.random(), true);
    request.onreadystatechange = function() {
        if (request.readyState != 4) return;
        clearTimeout(xhrTimeout); // очистить таймаут при наступлении readyState 4
        if (request.status==200) {
            //console.log(this.responseText);
            console.log(request.responseXML.getElementsByTagName('sport')[1].firstChild.nodeValue);
            
            
        }else{
            handleError(request.statusText) // вызвать обработчик ошибки с текстом ответа
        }
    
    }
    request.send();
    //request.abort();    
    request = null;    
    
}


Пример 2
setInterval(lin, 3000);
function lin() {
var xhr;
if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject("Microsoft.XMLHTTP");}
xhr.open("POST", "/infoxml", true);
xhr.onreadystatechange=function(){
  if (xhr.readyState != 4) return
  clearTimeout(xhrTimeout) // очистить таймаут при наступлении readyState 4
  if (xhr.status == 200) {
      console.log(xhr.responseXML.getElementsByTagName('sport')[1].firstChild.nodeValue);
  }else{
      handleError(xhr.statusText) // вызвать обработчик ошибки с текстом ответа
  }
}
xhr.send();
}

var xhrTimeout = setTimeout( function(){ xhr.abort(); handleError("Timeout") }, 7000);// Таймаут 3 секунд
function handleError(message) {
  // обработчик ошибки
  alert("Ошибка: "+message)
}



Эти оба примера перегружают память и не могу понять почему подскажите как правильно обращаться.
Ответить с цитированием
  #2 (permalink)  
Старый 18.12.2017, 20:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,595

Если код именно такой, какой приведён здесь, то:
1. С запросами всё в порядке, память должна нормально со временем освобождаться.
2. xhrTimeout будет падать с ошибкой, ибо не видит никакого "xhr".

Можете попробовать переиспользовать один и тот же запрос, чтоб наверняка:
var infoRequest = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
infoRequest.onreadystatechange = function() {
  if (request.readyState !== 4) return;
  if (request.status === 200) {  
    handleSuccess(request.responseXML.getElementsByTagName('sport')[1].firstChild.nodeValue); //обрабатываем ответ
  }else{
    handleError(request.statusText); // вызвать обработчик ошибки с текстом ответа
  }
  infoRequest.abort(); // очищаем, если даже одна копия в памяти - много
  setTimeout(requestInfo, 3000); // ставим таймаут, только после того как получили ответ, чтоб запросы не наслаивались в случае лагов 
}

function handleSuccess(txt){
  console.log(txt);
}

function requestInfo() { 
    infoRequest.open('GET','/infoxml' + Math.random(), true);
    infoRequest.send();    
};

requestInfo();
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 18.12.2017, 21:12
Кандидат Javascript-наук
Отправить личное сообщение для biryukovm Посмотреть профиль Найти все сообщения от biryukovm
 
Регистрация: 13.12.2013
Сообщений: 110

Сообщение от Aetae Посмотреть сообщение
Если код именно такой, какой приведён здесь, то:
1. С запросами всё в порядке, память должна нормально со временем освобождаться.
2. xhrTimeout будет падать с ошибкой, ибо не видит никакого "xhr".

Можете попробовать переиспользовать один и тот же запрос, чтоб наверняка:


Ваш пример мне очень нравится понятно примерно что за что отвечает, но память серовно грузится медленно но нагружается при старте сайта 98000-120000 КБ
И растет уже через минут 10-15 350000КБ (в 2 раза)
Ответить с цитированием
  #4 (permalink)  
Старый 18.12.2017, 22:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,595

А у вас нигде не используются элементы из request.responseXML? Не текстовые данные, а элементы? Оные могут тянуть за собой весь xml.
А вообще, если память не продолжает расти, а вырастает до определённого уровня и всё - значит столько памяти надо браузеру, на сём и сказке конец.
Можно попробовать не использовать responseXML и получать ответ как text/plain, после чего добывая нужные значения из resposeText вручную: DOM дерево кушает память неплохо, и ради пары текстовых значений его можно не создавать.
Ещё можно no-cache отдавать, возможно поможет.

Есть подозрение, что проблема где-то в другом месте.
__________________
29375, 35

Последний раз редактировалось Aetae, 18.12.2017 в 22:46.
Ответить с цитированием
  #5 (permalink)  
Старый 19.12.2017, 09:11
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,139

setInterval без clearInterval -- место для удара головой.
как этот код вызывается ?
Приведенный пример проблему не воспроизводит нужен полный пример.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с xml Phenix Общие вопросы Javascript 3 03.04.2013 12:16
Кроссдоменная загрузка XML nule AJAX и COMET 8 28.12.2011 12:22
Загрузка и обработка xml файла Visvitalis jQuery 0 26.09.2011 16:09
Загрузка XML документа zeraid Общие вопросы Javascript 0 25.05.2011 16:10
загрузка данных из XML, почему загружает только в Explorer asked86 AJAX и COMET 2 18.12.2009 16:29