Debounce and Throttling
Intro
안녕하세요 달리입니다. 오늘은 Event 처리 기법 중에 하나인 debounce와 throttle에 대해서 얘기해보려 합니다
두 기법은 짧은 시간안에 이벤트 감지가 (사람 입장에서는 거의 연속적으로 일어나는) 부분에 이벤트를 일정 시간 주기를 줘서 효율적으로 처리하는 기법입니다.
Throttling 시간 동안 한 번 만 실행되게 하는 함수
ex) 0.1ms 동안 한 번만 실행 나머지 event 무시
debounce 최소, 시간 주기가 지나여 이벤트가 실행되게 하는 함수
적절한 예) 엘리베이터에 문이 사람을 태우고 올라가는 상황가 잘 맞아 떨어진다. 이벤트가 발생해서 문을 열고 사람을 태웠다. 묻이 닫히기 전에 다시 이벤트가 발생하면 문이 열린다. 😄
debounce: 나 0.1초 안 쉬고 달렸으니 다음 일은 거부한다 term이 0.1초 있어야 한다. throttle: 0.1초동안 한 번만 처리할거야, 다음 일은 그 다음 0.1초에
주로사용 되는 곳
throttle: 스크롤 이벤트 debounce : 자동완성 검색 input 등 , 어느정도 연석된 키 입력 이벤트에 많이 쓰임
resizing , drag & drop 등
직접 구현해보기
- debounce
export default (function() {
let timer = null;
function debounce(handler, cycle = 200) {
try {
if(typeof !==function){
throw Error('함수를 받아야 합니다')
}
}
catch(error){
console.log(error);
}
if(timer){
clearTimeout(timer)
}
timer = setTimeout(handler, cycle)
}
function throttling(handler, cycle = 200) {
try {
if(typeof !==function){
throw Error('함수를 받아야 합니다')
}
}
catch(error){
console.log(error);
}
if(!timer){
timer = setTimeout(()=>{
timer = null;
handler()
}, cycle)
}
}
return {
debounce,
throttling
};
})()
eventHelper.debounce((e)=>handler(e.target.value))
lodash 같은 유틸 함수를 참고해보면서 구현해보는 것도 좋은 방법이다.