2014-10-28 2 views
0

Я использую следующий код в одной из моих программ. Он предоставляет сервер-push для HTML-интерфейса.Является ли этот код JavaScript причиной утечек памяти?

Все работает так, как ожидалось, но после некоторого времени работы (несколько дней) браузер ест всю память и компьютер зависает и ее необходимо перезапустить.

Возможно ли, что мой код утечки памяти, или проблема в браузере? Я знаю, что это возможно плохой код JavaScript утечка памяти в некоторых случаях и до тех пор, как мои навыки JS близки к нулю ...

сам код:

var keepAliveTimer = null; 

function gotActivity() { 
    if (keepAliveTimer != null) clearTimeout(keepAliveTimer); 
    keepAliveTimer = setTimeout(connect, 3000); 
} 

function connect(){ 
    gotActivity(); 
    var source = new EventSource('/Events?'); 
    source.onmessage = 
    function (event) { 
     var N = event.data.split("="); 
     var K=N.shift(); 
     var H = ""; 
     for (var i=0; i<N.length; i++) { 
     if (i>0) {H += "="}; 
     H += N[i]; 
     }; 

     var el = document.getElementById(K); 

     if (el.hasAttribute("value")) { 
     el.value = H; 
     } else { 
     el.innerHTML = H; 
     }; 
    }; 
}; 

connect();  

Это держать-живой таймер механизм был предложен в this answer.

EDIT1: снова считывает источник. Когда будет создан объект EventSource? По моему мнению, выход из connect() изменен в переменной source, и объект EventSource остается навсегда. Следующий вызов connect() просто создаст другой такой объект, не разрушив старый. Я прав?

ответ

0

После некоторого анализа и испытаний, я пришел к следующему коду, который, кажется, не происходит утечка памяти больше:

var keepAliveTimer = null; 
var source = null; 

function gotActivity() { 
    if (keepAliveTimer != null) clearTimeout(keepAliveTimer); 
    keepAliveTimer = setTimeout(connect, 3000); 
} 

function OnPush(event) { 
    var N = event.data.split("="); 
    var K=N.shift(); 
    var H = ""; 
    for (var i=0; i<N.length; i++) { 
    if (i>0) {H += "="}; 
    H += N[i]; 
    }; 

    var el = document.getElementById(K); 

    if (el.hasAttribute("value")) { 
    el.value = H; 
    } else { 
    el.innerHTML = H; 
    }; 

    el = null; 
    gotActivity(); 
}; 

function connect() { 
    if (source != null) source.onmessage = null; 
    source = null;  
    source = new EventSource('/Events?'); 
    source.onmessage = OnPush; 
    gotActivity();  
} 

connect(); 
Смежные вопросы