2013-03-14 13 views
5

Napisałem mały widget czatu, który co sekundę wywołuje wywołanie ajax, aby pobrać nowe wiadomości, które zostały opublikowane. Problem polega na tym, że jest to przeciekająca pamięć, a po około 15 minutach od otwarcia powoduje awarię mojej przeglądarki (Firefox).Przeciek pamięci w jQuery AJAX wywołuje

To chyba ja, ponieważ jestem początkującym względny, a jestem pewien, że tęskniłem za coś lub ja nie wyłączające moje zmienne itp ..

var chat = {} 
chat.fetchMessages = function() { 
    $.ajax({ 
     url: '/chat_ajax.php', 
     type: 'post', 
     data: { method: 'fetch'}, 
     success : function(data) { 
      $('#chat .messages').html(data); 
      $("#chat").scrollTop($("#chat")[0].scrollHeight); 
     } 
    }); 
} 
chat.interval = setInterval(chat.fetchMessages, 1000); 
chat.fetchMessages(); 

może ktoś proszę spojrzeć na moje (podstawowe) i sprawdź, czy możesz wykryć, gdzie występuje wyciek pamięci i co robię źle? Czy muszę usunąć niektóre zmienne lub coś takiego?

Wielkie dzięki!

+2

Jaką wersję jQuery? Jeśli dołączysz jQuery 1.9.1, czy nadal występuje? Starsze wersje jQuery miały wewnętrzną pamięć podręczną, w której przechowywano proste ciągi html, a kiedy programiści użyli kodu takiego jak twój powyżej, wygenerowali coś, co wydawało się wyciekiem pamięci, ponieważ pamięć podręczna nigdy nie jest czyszczona. –

+0

to, czego nie rozumiem, to $ ("# chat .messages"). Html (dane); czy zawsze otrzymujesz całą treść czatu za pomocą żądania AJAX. Myślę, że powinieneś poprosić tylko użytkownika, którego jeszcze nie przeczytałeś, dołączyć do .messages. w przeciwnym razie dane będą ostatecznie wielkim tekstem. –

Odpowiedz

5

Nigdy nie używaj z ajaxem, ponieważ twoje żądania nigdy nie zostaną zsynchronizowane. Zamiast tego użyj wartości setTimeout(), a następnie oczekuj na logikę, zainicjuj rekursywnie wywołanie zwrotne setTimeout() w wywołaniu .

Przykład.

$(DoMyAjax); // start your ajax on DOM ready 
function DoMyAjax() { 
    $.ajax({ 
     complete: function() { 
      // your logic here 
      setTimeout(DoMyAjax, 1000); 
     } 
    }); 
} 
+0

Dzięki Brad! Myślę, że trafiłeś w sedno ... –

+0

To faktycznie zwielokrotnia wycieki pamięci - teraz jest to megabajty na sekundę zamiast kilobajtów! –

+0

@NeilHillman jest tak w przypadku Helga stwierdza? Wygląda na to, że byłby oparty na jednym z powyższych komentarzy, który mówi, że jQuery przechowuje pamięć podręczną ciągów html, które nigdy się nie oczyszczają – ScottC

Powiązane problemy