디바운싱과 스로틀링

이재윤·2021년 9월 8일
0

JavaScript

목록 보기
9/10
post-thumbnail

💻 디바운싱

디바운싱은 짧은 시간 간격으로 이벤트가 연속해서 발생하면 이벤트 핸들러를 호출하지 않다가 일정시간이 경과한 이후에 이벤트 헨들러가 한 번만 호출되도록 합니다. 즉 짧은 시간 간격으로 발생하는 이벤트 핸들러를 그룹화해 마지막에 한 번만 이벤트 핸들러가 호출되도록 하는 기법입니다.

<div>
  <input class="normal-input"/>
  <span class="normal"></span>
</div>

<div>
  <input class="debounce-input">
  <span class="debounce"></span>
</div>
<script>
  const $normalInput = document.querySelector('.normal-input')
  const $debounceInput = document.querySelector('.debounce-input')

  const $normalSpan = document.querySelector('.normal')
  const $debounceSpan = document.querySelector('.debounce')

  const debounce = (callback, delay) => {
    let timerId;
    return e => {
      if (timerId) clearTimeout(timerId)
      timerId = setTimeout(callback, delay, e)
    }
  }

  $normalInput.addEventListener('input', (e) => {
    $normalSpan.innerText = e.target.value
  })

  $debounceInput.addEventListener('input', debounce((e) => {
    $debounceSpan.innerText = e.target.value
  }, 500))
</script>

debounce함수가 반환한 함수는 debounce함수에 두 번째 인수로 전달한 시간보다 짧은 간격으로 이벤트가 발생하면 이전 타이머를 취소하고 새로운 타이머를 재설정합니다.

💻 스로틀링

짧은 시간 간격으로 이벤트가 연속해서 발생하더라도 일정 시간 간격으로 이벤트 핸들러가 최대한 한 번만 호출되도록 합니다. 즉 스로틀링은 짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해 일정 시간 단위로 이벤트 핸들러가 호출되도록 호출 주기를 만듭니다.

const throttle = (callback, delay) => {
  let timerId;
  return (e) => {
    if (timerId) return;
    timerId = setTimeout(() => {
      callback(e);
      timerId = null;
    }, delay)
  }
}

throttle함수가 반환한 함수는 throttle함수에 두 번째 인수로 전달한 시간이 경과하기 이전에 이벤트가 발생하면 아무것도 하지 않다가 시간이 경과했을때, 콜백 함수를 호출하고 새로운 타이머를 재설정 합니다. 따라서 delay시간 간격으로 콜백함수가 한번씩 호출됩니다.

0개의 댓글