Debounce와 throttle은 시간이 지남에 따라 함수 실행을 허용하는 횟수를 제어하는 유사하지만 다른 기술이다.
각각의 기술에 대해 알아보고 언제 사용하는지 고찰해보자.
- 디바운스를 어떻게 구현하는지 정말 간단한 예시로 살펴보자!
- 타이핑이 될때마다 이벤트가 발생하는 코드에 디바운스를 적용하여 코드를 수정해보면서 이해해하고자 한다.
function typingInput() {
const name = nameElem.value;
console.log(`입력된 이름: ${name}`)
}
const nameElem = document.getElementById('inputName')
nameElem.addEventListener("input", typingInput)
위의 코드는 input 태그에 타이핑 될때마다 console 이 찍히는 것을 확인할 수 있다.
- 타이핑할때마다 console이 찍히는 것이 아니라 1초마다 타이핑이 찍히도록 디바운싱을 적용해보았다.
- setTimeout으로 특정 시간동안 딱한번만 함수가 실행되도록 코드를 작성한다.
- 마지막 함수 실행후 1초후 console 이 찍힌다.
let alertTimer
function alertWhenTypingStops() {
// 앞선 타이머를 리셋
// 따라서 마지막 함수가 실행 (타이핑을 멈추고선 함수실행)
if (alertTimer) {
clearTimeout(alertTimer)
}
const name = nameElem.value
// 타이머 시작
alertTimer = setTimeout(() => console.log(`입력된 이름: ${name}`), 1000)
}
const nameElem = document.getElementById('inputName')
nameElem.addEventListener("input", alertWhenTypingStops)
let isInThrottle
function increaseScoreDuringTyping() {
if (isInThrottle) {
return
}
isInThrottle = true
// 타이머 세팅
setTimeout(() => {
const score = document.querySelector('#score')
const newScore = parseInt(score.innerText) + 1
score.innerText = newScore
isInThrottle = false
}, 500)
}
const nameElem = document.querySelector('#inputName')
nameElem.addEventListener("input", increaseScoreDuringTyping)
참고:
개발자 아저씨들 힘을모아
https://codefrontend.com/debounce-throttle-js-react/