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();
Ich sehe :) – abhishekkannojia
'Stackoverflow setInterval' automatisch wiederholt, müssen Sie es nicht erneut aufrufen. Du verwechselst es mit 'setTimeout'. – JJJ
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