2017-03-24 3 views
0

Ich weiß, es gibt eine Reihe von Fragen und Antworten hier zu diesem Problem, aber ich weiß nicht, ob es wirklich auf meinen Fall zutrifft.JS setInterval() mem leak

Ich habe ein Zeitskript, mit setInterval Funktion. Es funktioniert gut, für die ersten Minuten, aber dann in Chrome/Opera Task-Manager sehe ich die Registerkarte mit diesem Skript läuft von 40 MB bis 2-3 GB! Es ist verrückt, und ich weiß nicht, wie ich das beheben soll. Nur wenn alle Skripte auf andere Weise neu geschrieben werden.

Script:

function checkTime(i) { 
    return (i < 10) ? "0" + i : i; 
}; 

function calcTime(city, offset) { 
    d = new Date(); 
    utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
    nd = new Date(utc + (3600000*offset)), 
     h = checkTime(nd.getHours()), 
     m = checkTime(nd.getMinutes()), 
     s = checkTime(nd.getSeconds()); 
    return nd.toLocaleString(); 
}; 

function updateTime() { 
    if (document.getElementById('timeMoscow')) { 
     calcTime('Moscow', '+3'); 
     document.getElementById('timeMoscow').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } 
    if (document.getElementById('timeKiev')) { 
     calcTime('Kiev', '+2'); 
     document.getElementById('timeKiev').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } else 
    if (document.getElementById('timeAstana')) { 
     calcTime('Astana', '+6'); 
     document.getElementById('timeAstana').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } 
    if (document.getElementById('timeNewYork')) { 
     calcTime('NewYork', '-4'); 
     document.getElementById('timeNewYork').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } 
    setInterval(updateTime, 500); //Problem 
} 

updateTime(); 
+0

Ich sehe :) – abhishekkannojia

+0

'Stackoverflow setInterval' automatisch wiederholt, müssen Sie es nicht erneut aufrufen. Du verwechselst es mit 'setTimeout'. – JJJ

+0

Nun, Sie sind rekursiv Einrichtung Intervall, die wiederum 'updateTime' aufgerufen, die wieder eingerichtet Intervall zu rufen' updateTime' und das passiert immer und immer wieder, bis Sie nicht genug Speicher haben – abhishekkannojia

Antwort

2

Sie rekursiv updateTime Funktion aufrufen, die setInterval verwendet, die wiederholt updateTime ist aufruft. Entfernen Sie den setInterval() Aufruf von der Methode und rufen Sie sie auf.

function updateTime() { 
    //You rest of code 
} 

setInterval(updateTime, 500); 
+0

Vielen Dank, funktioniert jetzt viel besser! – KAYOver