Skip to content

Latest commit

Β 

History

History
127 lines (79 loc) Β· 3.9 KB

settimeout-setinterval-requestanimationframe.md

File metadata and controls

127 lines (79 loc) Β· 3.9 KB

setTimeout, setInterval and requestAnimationFrame

setTimeoutκ³Ό setInterval은 μΈ‘μ • μ‹œκ°„μ΄ μ§€λ‚œ 후에 ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•œ λ©”μ†Œλ“œμ΄λ©° μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ•„λ‹Œ λΈŒλΌμš°μ € API(WebAPI)와 Node.jsμ—μ„œ μ§€μ›ν•œλ‹€.


setTimeout

let timerId = setTimeout(func, [delay], [args1], [args], ...)

setTimeout λ©”μ†Œλ“œλŠ” 타이머가 μ™„λ£Œλœ ν›„ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μΈ func와 타이머λ₯Ό μ„€μ •ν•˜λŠ” delay, func에 μ „λ‹¬λ˜λŠ” νŒŒλΌλ―Έν„°μΈ argsλ₯Ό 인자둜 κ°€μ§„λ‹€.

setTimeout λ©”μ†Œλ“œλŠ” 타이머가 μ™„λ£Œλ˜λ©΄ funcλ₯Ό 1회 μ‹€ν–‰μ‹œν‚¨λ‹€.

function sayHi() {
  alert('Hi');
}

setTimeout(sayHi, 1000);
// 1000ms후에 alert "Hi"좜λ ₯
function sayHi(phrase, who) {
  alert( phrase + ', ' + who );
}

setTimeout(sayHi, 1000, "Hi", "Han"); // Hi, Han

setTimeout은 numberνƒ€μž…μ˜ timer μ‹λ³„μžλ₯Ό λ¦¬ν„΄ν•˜λŠ”λ°, clearTimeout을 μ΄μš©ν•΄ 타이머가 μ™„λ£Œλœ ν›„ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 것을 μ·¨μ†Œ ν•  μˆ˜μžˆλ‹€.

let timerId = setTimeout(() => {
	alert('Hi');
), 10000};

clearTimeout(timerId);

setInterval

let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)

setInterval은 setTimeoutκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ 타이머 μ™„λ£Œ ν›„ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μΈ func와 타이머λ₯Ό μ„€μ •ν•˜λŠ” delay, func에 μ „λ‹¬λ˜λŠ” νŒŒλΌλ―Έν„°μΈ argsλ₯Ό 인자둜 κ°€μ§„λ‹€.

setInterval은 타이머 간격에 따라 주기적으둜 funcλ₯Ό μ‹€ν–‰ν•˜λ©° setTimeoutκ³Ό 같이 clearInterval을 톡해 주기적으둜 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ”κ²ƒμ„ μ·¨μ†Œ ν•  수 μžˆλ‹€.

let timerId = setInterval(() => alert('tick'), 2000);

setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000);

// 2초, 4μ΄ˆμ— 'tick' alert 좜λ ₯
// 5μ΄ˆμ— 'stop' alert 좜λ ₯ ν›„ setInterval μ‹€ν–‰ 쀑지

setTimeoutκ³Ό setTimeout의 차이점은 μ•„λž˜μ™€ κ°™λ‹€.

  • setInterval은 이전 ν•¨μˆ˜ 호좜의 μƒνƒœμ™€ 상관 없이 μ‹œκ°„ κ°„κ²©λ§ˆλ‹€ ν•¨μˆ˜λ₯Ό 콜 μŠ€νƒμ— μ „λ‹¬ν•˜λŠ” 반면, setTimeout은 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  μƒˆλ‘œμš΄ 호좜이 μžˆμ„λ•Œλ§Œ λ‹€μŒ ν˜ΈμΆœμ„ μ‹€ν–‰ν•œλ‹€.

  • 예λ₯Ό λ“€μ–΄, setInterval의 μ‹œκ°„κ°„κ²©μ΄ 1000ms이고 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” μ‹œκ°„μ΄ 300msμΌλ•Œ, 호좜 μ’…λ£Œμ™€ λ‹€μŒ ν˜ΈμΆœκΉŒμ§€μ˜ μ‹œκ°„ 간격은 700msκ°€ λœλ‹€.

setIntervalλŒ€μ‹  setTimeout을 μž¬κ·€μ μœΌλ‘œ μ΄μš©ν•  수 μžˆλ‹€.

function func() {
    console.log("It's been 2 second");
    setTimeout(repeatingFunc, 2000);
}

setTimeout(func, 2000);

// setTimeout을 μž¬κ·€μ μœΌλ‘œ μž‘μ„±ν•΄ funcλ₯Ό 2μ΄ˆλ§ˆλ‹€ μ‹€ν–‰
  • λΈŒλΌμš°μ € ν™˜κ²½κ³Ό 전체적인 μ½”λ“œνλ¦„μ— 따라 λ°œμƒν•˜λŠ” μ•½κ°„μ˜ μΈν„°λ²Œ 지연을 λ°©μ§€ν•  수 μžˆλ‹€..

  • 비동기 μž‘μ—…μ˜ 경우 맀우 λΉ„νš¨μœ¨μ μΈ κΈ΄ μš”μ²­ λŒ€κΈ°μ—΄μ„ λ§Œλ“œλŠ” 것을 λ°©μ§€ν•  수 μžˆλ‹€.


requestAnimationFrame

function repeatOften() {
  // Do whatever
  requestAnimationFrame(repeatOften);
}
requestAnimationFrame(repeatOften);

requestAnimationFrame은 setInterval의 μΈν„°λ²Œμ„ 맀우 μž‘κ²Œ ν–ˆμ„ λ•Œ μš”μ²­μ΄ μ§€μ—°λ˜λŠ” 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” λ©”μ†Œλ“œμ΄λ‹€.

setInterval 비ꡐ해 requestAnimationFrame이 κ°€μ§€λŠ” μž₯점은 λ‹€μŒκ³Ό κ°™λ‹€.

  • λΈŒλΌμš°μ €μ—μ„œ μ΅œμ ν™” ν•  수 μžˆμ–΄ 더 λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό μ μš©ν•  수 μžˆλ‹€.

  • λΉ„ν™œμ„±ν™”λœ νƒ­μ—μ„œλŠ” μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ€‘μ§€λ˜μ–΄ CPUλ₯Ό 효율적으둜 μš΄μš©ν•  수 μžˆλ‹€.

  • 배터리λ₯Ό μ ˆμ•½ν•  수 μžˆλ‹€.

  • cancelAnimationFrame을 톡해 ν•¨μˆ˜μ˜ 싀행을 μ·¨μ†Œ ν•  수 μžˆλ‹€.




Reference