2017-03-24 8 views
0

나는이 문제에 대해 많은 질문과 대답을하고 있지만 이것이 실제로 나의 사건에 적용되는지는 모르겠다.JS setInterval() mem leak

나는 setInterval 기능을 가진 시간 스크립트가 있습니다. 처음 몇 분 동안은 제대로 작동하지만 크롬/오페라 작업 관리자에서이 스크립트가있는 탭이 40MB에서 2-3GB로 이동하는 것을 볼 수 있습니다! 그것은 미친 짓이고, 나는 그것을 고치는 법을 모른다. 다른 방법으로 모든 스크립트를 다시 작성하는 경우에만.

스크립트 : 당신은 재귀 적으로 반복이다 updateTime를 호출 setInterval를 사용하여 updateTime 함수를 호출하는

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

stackoverflow 참조 : – abhishekkannojia

+0

'setInterval'이 자동으로 반복되므로 다시 호출 할 필요가 없습니다. 당신은'setTimeout'과 혼동하고 있습니다. – JJJ

+0

그럼 재귀 적으로 다시 interval을 설정하고, 다시 updateTime을 호출하여 interval을 다시 설정하여 updateTime을 호출하면 메모리가 부족해질 때까지 반복적으로 발생합니다. – abhishekkannojia

답변

2

. 메소드에서 setInterval() 호출을 제거하고이를 호출하십시오.

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

setInterval(updateTime, 500); 
+0

감사합니다. – KAYOver