Why not to use setInterval - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์ setInterval์ ์ฐ๋ฉด ์๋๋๊ฐ
์ต๊ทผ์ ์ ๋ 10์ด๋ง๋ค ajax์ ๋ณด๋ด๋ ๊ฒ๊ณผ ๊ฐ์ด ํน์ ํ ์๊ฐ ๊ฐ๊ฒฉ ํ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ธฐ๋ฅ์ call ํ๋ ์๊ตฌ ์กฐ๊ฑด์ ๋ฐ๊ฒฌํ์ด์. ์ต์์ ์ต์ ์ ์ค์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
setInterval
์ด ๋ด ์ผ๊ตด์ ํฌ๋์ปค์ฒ๋ผ ๋ ๋ ค๋ฒ๋ ธ์ด์ :)
setInterval์ด ์ ์ ํ์ง ์ดํดํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ณธ์ง์ ์ผ๋ก single threaded๋ผ๋ ์ฌ์ค์ ๋ช ์ฌํด์ผ ํฉ๋๋ค.
์ฆ, ํ ๋ฒ์ ๋ ๊ฐ ์ด์์ ์์ ์ ์ํํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
function์ด setInterval
์์ ์ธ๊ธ๋ ์ง์ฐ ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ(์: ์ ๋ ์๋ฃ๋์ง ๋ชปํ ์ ์๋ ajax call), breathing room์ด ์๊ฑฐ๋ setInterval์ด ๋ฆฌ๋ฌ์ ๊นจ๋จ๋ฆฝ๋๋ค.
var fakeCallToServer = function() {
setTimeout(function() {
console.log('returning from server', new Date().toLocaleTimeString());
}, 4000);
}
setInterval(function(){
let insideSetInterval = new Date().toLocaleTimeString();
console.log('insideSetInterval', insideSetInterval);
fakeCallToServer();
}, 2000);
//insideSetInterval 14:13:47
//insideSetInterval 14:13:49
//insideSetInterval 14:13:51
//returning from server 14:13:51
//insideSetInterval 14:13:53
//returning from server 14:13:53
//insideSetInterval 14:13:55
//returning from server 14:13:55
Try above code snippets in your console
console.log ๋ฌธ์์ ๋ณผ ์ ์์ต๋๋ค. setInterval
์ ajax call์ด ์ค๋ ์ ์ค๋ ์๊ดํ์ง ์๊ณ ๊ณ์ํด์ ajax call์ ๋ณด๋
๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์๋ฒ์์ ๋ง์ ์์ฒญ์ ํ ๋ฒ์ ๋๊ธฐ์ด์ ์ฌ๋ฆด ์ ์์ต๋๋ค.
์ด์ setInterval
์์ ๋๊ธฐ์ ์ฐ์ฐ์ ์๋ํ๊ฒ ์ต๋๋ค.
var counter = 0;
var fakeTimeIntensiveOperation = function() {
for(var i =0; i< 50000000; i++) {
document.getElementById('random');
}
let insideTimeTakingFunction = new Date().toLocaleTimeString();
console.log('insideTimeTakingFunction', insideTimeTakingFunction);
}
var timer = setInterval(function(){
let insideSetInterval = new Date().toLocaleTimeString();
console.log('insideSetInterval', insideSetInterval);
counter++;
if(counter == 1){
fakeTimeIntensiveOperation();
}
if (counter >= 5) {
clearInterval(timer);
}
}, 1000);
//insideSetInterval 13:50:53
//insideTimeTakingFunction 13:50:55
//insideSetInterval 13:50:55 <---- not called after 1s
//insideSetInterval 13:50:56
//insideSetInterval 13:50:57
//insideSetInterval 13:50:58
setInterval
์ด ์๊ฐ ์ง์ค์ ์ธ ์ด์ฉ์ ๊ฒฝํํ ๋,
a) ํธ๋์ ์ค๋ฅด๋ ค๊ณ ํ๊ฑฐ๋
b) ์๋ก์ด ๋ฆฌ๋ฌ์ ์ฐฝ์กฐํ๋ ๋ ๊ฐ์ง ์ค ํ๋๋ฅผ ์ํํฉ๋๋ค.
์ฌ๊ธฐ ํฌ๋กฌ์ ์๋ก์ด ๋ฆฌ๋ฌ์ ๋ง๋ค์ด๋ ๋๋ค.
๊ฒฐ๋ก
๋น๋๊ธฐ์ ์์
์ ๊ฒฝ์ฐ setTimeInterval
์ ์ค์ ํฉ๋๋ค. ๊ฐ๊ฒฉ์ ์์ฒญ์ ๊ธด ๋๊ธฐ์ด์ ์์ฑํ์ฌ ๋งค์ฐ ์ญํจ๊ณผ๋ฅผ ๋
๋๋ค.
์๊ฐ ์ง์ฝ์ ์ธ ๋๊ธฐํ ์์
์ ๊ฒฝ์ฐ setTimeInterval
์ ์ค์ ํฉ๋๋ค. ๊ฐ๊ฒฉ์ด ๋ฆฌ๋ฌ์ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค.
๋ํ setInterval
์ฝ๋ ๋ธ๋ก์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์คํ์ ์ค์งํ์ง ์๊ณ ์๋ชป๋ ์ฝ๋๋ฅผ ๊ณ์ ์คํํฉ๋๋ค.
๋งํ ๊ฒ๋ ์์ด ๊ทธ๋ค์ ๋งํ ๊ฒ๋ ์๊ณ clearInterval(๊ฐ๊ฒฉ) ๊ธฐ๋ฅ์ผ๋ก ์ค์งํฉ๋๋ค.
๋๋ ์๊ฐ์ ๋ฏผ๊ฐํ ์์
์ ๊ฒฝ์ฐ setTimeout
์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.