2013-03-14 20 views
5

Ho scritto un piccolo widget di chat-box che esegue una chiamata ajax ogni secondo, per recuperare i nuovi messaggi che sono stati postati. Il problema è che sta perdendo memoria, e dopo solo 15 minuti di apertura si blocca il mio browser (Firefox).Perdita di memoria in jQuery Chiamate AJAX

E 'probabilmente me, come io sono un novizio relativo, e sono sicuro che ho perso qualcosa o no sto disinserimento mio variabili, ecc ..

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(); 

qualcuno può sguardo alla mia (di base) e vedere se riesci a individuare dove si verifica la perdita di memoria e cosa sto facendo male? Devo disabilitare alcune variabili o qualcosa del genere?

Grazie mille!

+2

Quale versione di jQuery? Se includi jQuery 1.9.1, si verifica ancora? Le versioni precedenti di jQuery avevano una cache interna in cui venivano memorizzate semplici stringhe html, quindi quando gli sviluppatori utilizzavano codice come il proprio sopra, generava quella che sembrava essere una perdita di memoria perché la cache non veniva mai cancellata. –

+0

ciò che non ho capito è $ ('# chat .messages'). Html (data); ottieni sempre l'intero contenuto della chat con la richiesta AJAX. Penso che dovresti richiedere solo la parte che l'utente non ha ancora letto per aggiungere questo messaggio a .messages. altrimenti i dati saranno un testo enorme alla fine. –

risposta

5

Mai utilizzare setInterval() con ajax, altrimenti le richieste non verranno mai sincronizzate. Utilizzare invece setTimeout() e in attesa della logica, avviare setTimeout() in modo ricorsivo nel callback complete.

Esempio.

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

Grazie Brad! Penso che tu abbia colpito il chiodo sulla testa ... –

+0

Questo effettivamente moltiplica le perdite di memoria - ora è megabyte al secondo invece di kilobyte! –

+0

@NeilHillman è questo il caso come afferma Helga? Sembra che sarebbe basato su uno dei commenti sopra che dice jQuery mantiene una cache di stringhe html che non si cancella mai – ScottC