Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.03.2013, 09:09
Интересующийся
Отправить личное сообщение для Fareastaz Посмотреть профиль Найти все сообщения от Fareastaz
 
Регистрация: 13.10.2011
Сообщений: 10

Memory Leak при работе с $.getJSON и циклом $.each
Здравствуйте,
у меня к вам такой вопрос. Пишу скрипт для циклического отображения данных на странице из файла JSON и вставляю их с помощью двух функций. В первой использую цикл для прохода по всем элементам json файла а так же вызываю ее же в качестве рекурсии для цикличного прохода. Во второй добавляю 5 ненумерованных списков на страницу с тремя значениями. а также удаляю первый из низ для создания анимации (прогона элементов снизу вверх). Проблема в следующем:
Скрипт начинает есть много ресурсов как процессора так и памяти и как я понял функция .remove() не очищает память за собой. Скажите как можно изменить этот цикл или произвести очистку памяти после вывода 5 элементов списка не убивая сам цикл. Требуется чтобы данные циклично отображались. Функция остановки которую я установил на нажатие кнопки делает паузу но не останавливает цикл и так же не очищает память (как лучше поступить с функцией паузы цикла?)

Сам скрипт:

<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="content-type" content="text/html" />
	<meta name="author" content="Viacheslav" />
    <script src="js/jquery-1.7.1.min.js"></script>
	<title>JSON TEST-1</title>
</head>

<body>

  <div id="content_div">
        <ul></ul>  
  </div>
<input type=button value="pause/play" onclick="continue_reporting = ( continue_reporting == 1 ) ? 0 : 1;">
    <script type="text/javascript">        

        var counter = 0;
        var delay_entry = 0;
        delay_fetch = 0;
        var continue_reporting = 1;      
        var node_list = new Array( );
        //var content_div = $("#content_div");
        var child = 0;
       
        
        fetch_data(); // initial run
        function fetch_data()
        {

          $.getJSON('js/list.json?i=' + Math.random(), function(data){
              //console.log("data.length: " + data.length );
              $.each(data, function(key,value){
                counter++
                setTimeout( pusher, 1000 * delay_entry, value );
                delay_entry++;                
                
              })

              

          })  
          setTimeout( fetch_data, 1000 * delay_fetch );
          delay_fetch++;
            
        }
        
        function pusher( value )
        {      
          
            if ( continue_reporting == 1 ) 
            {
              $("#content_div").append("<ul>" + 
                                    "<li>" +  value.reg + "</li>" +
                                    "<li>" +  value.bids[0].ind + "</li>" +
                                    "<li>" +  value.bids[0].v + "</li>" +
                                "</ul>");
                child++;             
              
               if (child > 4){
              $("#content_div ul:first-child").remove();              
              }
                
              }
              console.log("children = " + child);
              
        }
        
        
    </script>
      


</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 04.03.2013, 12:27
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

зачем рекурсия?
Ответить с цитированием
  #3 (permalink)  
Старый 04.03.2013, 16:28
Интересующийся
Отправить личное сообщение для Fareastaz Посмотреть профиль Найти все сообщения от Fareastaz
 
Регистрация: 13.10.2011
Сообщений: 10

рекурсия для вызова самой же функции, и повторного выполнения...данные нужно отображать без остановки, без нее если заканчиваются данные в файле процесс вывода останавливается. Какие варианты еще есть если без рекурсии?
Ответить с цитированием
  #4 (permalink)  
Старый 04.03.2013, 17:33
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

содержание js/list.json?i=' + Math.random() постоянно меняется и его нужно постоянно перечитывать?
Ответить с цитированием
  #5 (permalink)  
Старый 04.03.2013, 17:34
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

я бы вывел setTimeout( fetch_data, 1000 * delay_fetch ); за пределы fetch_data()
Ответить с цитированием
  #6 (permalink)  
Старый 04.03.2013, 17:41
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

$.getJSON выполняется асинхронно и setTimeout( pusher, 1000 * delay_entry, value ); тормозит только вызов функции pusher и не тормозит функцию fetch_data, она выполняется соглассно таймеру setTimeout( fetch_data, 1000 * delay_fetch ); и если она еще в рекурсии ... то не удивительно что браузер падает на коленки
Ответить с цитированием
  #7 (permalink)  
Старый 04.03.2013, 17:42
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от skynet-mfd
содержание js/list.json?i=' + Math.random() постоянно меняется и его нужно постоянно перечитывать?
??
Ответить с цитированием
  #8 (permalink)  
Старый 04.03.2013, 17:44
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

т.е. другими словами fetch_data() не ждет завершения $.getJSON
Ответить с цитированием
  #9 (permalink)  
Старый 04.03.2013, 17:52
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

Сообщение от danik.js Посмотреть сообщение
??
ну ты же тут получаешь какой то json массив этим запросом? я про его содержание....

Последний раз редактировалось skynet-mfd, 04.03.2013 в 17:58.
Ответить с цитированием
  #10 (permalink)  
Старый 04.03.2013, 18:03
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Я ничего не получаю. Просто мне тоже интересно. Очень надеюсь на ответ «да».
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы при работе с Drag magnus-crank ExtJS 0 23.12.2012 20:28
Скрипт при работе с чербоксами dmitry111 Общие вопросы Javascript 4 27.08.2012 18:08
Возможности JavaScript при работе с графикой PetrS Общие вопросы Javascript 2 20.03.2012 18:33
проблема с событиями при работе с Ext.extend slavik27 ExtJS 1 04.09.2011 13:05
<= IE8 memory leak, IE9 - fine AbNormy Internet Explorer 1 20.05.2011 19:47