Search

38장 타이머(Timer)

대분류
언어
서적
소분류
JS DeepDive
태그
호출 스케줄링
타이머
디바운스
스로틀
최종 편집 일시
2024/10/27 15:38
생성 일시
2024/02/08 00:19
14 more properties

호출 스케줄링

일정 시간이 경과된 이후에 호출되도록 함수 호출을 예약하려면 타이머 함수 사용! --> 호출 스케줄링
JS에서는 이를 위해 setTimeout, setInterval, clearTimeout, clearInterval 을 제공한다.
setTimeout: 타이머가 만료되면 단 한번 호출,
setInterval: 타이머가 만료될 때마다 반복 호출
clearTimeout, clearInterval: 위 함수들의 각각의 타이머 제거에 사용
JS엔진은 싱글 스레드 이기 때문에(단 하나의 실행 컨텍스트) 타이머 함수는 비동기 처리 방식으로 동작한다.

타이머 함수

setTimeout / clearTimeout

const timeoutID = setTimeout(func|code[, delay, param1, param2, ...]);
delay 인수는 생략한 경우 기본값 0이 지정되며, delay 시간이 설정된 타이머가 만료되면 콜백 함수가 즉시 호출되는 것이 보장받는 것은 아니고 4ms 이하인 경우 최소 지연 시간 4ms가 지정된다.
setTimeout 함수는 타이머를 식별할 수 있는 고유한 id를 반환한다.
id의 반환값
브라우저: 숫자
Node.js: 객체
const timerId = setTimeout(() => console.log('HI!'), 1000); clearTimeout(timerId);
Plain Text
복사

setInterval / clearInterval

const timerId = setInterval(func|code[, delay, param1, param2, ...]);
setInterval 함수도 마찬가지로 id를 반환하는데 브라우저에서 숫자, Node.js에서 객체를 반환한다.
let count = 1; const timerId = setInterval(() => { console.log(count); if (count++ === 5) clearInterval(timerId); }, 1000);
Plain Text
복사

디바운스와 스로틀

scroll, resize, input, mousemove 같은 이벤트는 짧은 시간 간격으로 연속해서 발생 => 성능에 문제를 줌
디바운스와 스로틀은 짧은 시간안에 여러번 발생하는 이벤트들을 그룹화해서 과도한 이벤트 핸들러의 호출을 방지하는 프로그래밍 기법이다.
const debounce = (callback, delay) => { let timerId; return event => { if (timerId) clearTimeout(timerId); timerId = setTimeout(callback, delay, event); }; }; const throttle = (callback, delay) => { let timerId; return event => { if (timerId) return; timerId = setTimeout( () => { callback(event); timerId = null; }, delay, event ); }; };
Plain Text
복사
event를 사용하지 않더라도 이벤트를 명시적으로 넘겨줌

디바운스

짧은 시간 간격으로 발생하는 이벤트를 그룹화해서 마지막에 한 번만 이벤트가 호출되도록 함
resize 이벤트 처리나 input 요소의 입력된 값으로 ajax 요청하는 입력 필드 자동완성, 버튼 중복 클릭 방지 처리등에 사용한다.

스로틀

짧은 시간 간격으로 발생하는 이벤트를 그룹화해서 일정 시간 단위로 이벤트 핸들러가 최대 한 번만 호출되도록 함.
delay 시간이 경과했을 때 이벤트가 발생하면 콜백 함수를 호출하고 새로운 타이머를 재설정한다. (delay 시간 간격으로 콜백함수가 호출된다)
-> scroll 이벤트 처리나 무한 스크롤 구현 등에 유용하게 사용된다.
디바운스나 스로틀을 사용할 거면 Underscore나 lodash의 디바운스, 스로틀 함수를 사용하는 것을 권장한다.