λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘¨‍πŸ’» web.dev/js.ts

[JavaScript] Debounce 와 Throttle 에 λŒ€ν•΄ μ•Œμ•„λ³΄μž

by HandHand 2022. 7. 9.

 

πŸ“Œ Debounce 와 Throttle 을 μ΄μš©ν•œ 이벀트 처리

debounce 와 throttle 은 κ³Όλ„ν•œ 이벀트 λ°œμƒμœΌλ‘œ μΈν•œ μ„±λŠ₯ μ €ν•˜λ₯Ό λ°©μ§€ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

이 λ‘˜μ€ 일정 μ‹œκ°„ 간격을 두고 이벀트λ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” λ™μΌν•œ λͺ©ν‘œλ₯Ό 가지고 μžˆμ§€λ§Œ

μ„œλ‘œ λ™μž‘ 방식이 λ‹€λ¦…λ‹ˆλ‹€.

 

πŸ“Œ Debounce 의 λ™μž‘ 방식과 κ΅¬ν˜„

1️⃣ Debounce λ™μž‘ μ˜ˆμ‹œ

debounce λŠ” 이벀트λ₯Ό κ·Έλ£Ήν™”ν•˜μ—¬ ν•˜λ‚˜μ˜ 이벀트만 ν˜ΈμΆœλ˜λ„λ‘ ν•©λ‹ˆλ‹€.

 

 

μœ„ μ˜ˆμ‹œμ™€ 같이 debounce λŠ” 일정 waiting time λ™μ•ˆ ν•¨μˆ˜ 호좜이 μ—†λŠ” 경우

κ°€μž₯ λ§ˆμ§€λ§‰ 이벀트λ₯Ό μ„ νƒν•©λ‹ˆλ‹€. (trailing)

이 λŒ€μ‹ μ— κ°€μž₯ 처음 호좜된 이벀트λ₯Ό μ„ νƒν•˜λŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€. (leading)

2️⃣ Debounce κ΅¬ν˜„ν•˜κΈ°

function debounce(callbackFn, timerTick) {
  let timerId = null;

  return (...args) => {
    if (timerId) {
      clearTimeout(timerId);
    }

    timerId = setTimeout(() => {
      callbackFn.apply(this, args);
    }, timerTick);
  };
}

Debounce λ™μž‘ ν™•μΈν•˜κΈ°

μœ„μ—μ„œ κ΅¬ν˜„ν•œ throttle ν•¨μˆ˜μ˜ λ™μž‘μ„ ν…ŒμŠ€νŠΈ ν•˜κΈ° μœ„ν•΄μ„œ

λ‹€μŒ μ½”λ“œλ₯Ό 톡해 scroll μ΄λ²€νŠΈμ— ν•Έλ“€λŸ¬λ₯Ό ν• λ‹Ήν–ˆμŠ΅λ‹ˆλ‹€.

const debouncedEventHandler = debounce(() => console.log("event!"), 2000);

window.addEventListener("scroll", debouncedEventHandler);

 

 

debounce λ₯Ό μ μš©ν•œ scroll event handler μ˜ˆμ‹œ

 

πŸ“Œ Throttle 의 λ™μž‘ 방식과 κ΅¬ν˜„

Throttle λ™μž‘ μ˜ˆμ‹œ

Throttle 은 일정 κΈ°κ°„λ™μ•ˆ 연속적인 μ΄λ²€νŠΈκ°€ μ΅œλŒ€ 1번만 μ‹€ν–‰λ˜κ²Œ ν•©λ‹ˆλ‹€.

 

 

μ΄λ²€νŠΈκ°€ κΎΈμ€€νžˆ λ°œμƒν•˜λŠ” μƒν™©μ—μ„œ 일정 time interval κ°„κ²©μœΌλ‘œ

이벀트λ₯Ό μ²˜λ¦¬ν•˜κ³  μ‹Άλ‹€λ©΄ debounce λŒ€μ‹  throttle 을 μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

1️⃣ Throttle κ΅¬ν˜„ν•˜κΈ°

function throttle(callbackFn, timerTick) {
  let waiting = false;

  return (...args) => {
    if (!waiting) {
      callbackFn.apply(this, args);
      waiting = true;

      setTimeout(() => (waiting = false), timerTick);
    }
  };
}

2️⃣ Throttle λ™μž‘ ν™•μΈν•˜κΈ°

λ™μΌν•œ λ°©λ²•μœΌλ‘œ throttle ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό scroll μ΄λ²€νŠΈμ— ν• λ‹Ήν•΄λ΄€μŠ΅λ‹ˆλ‹€.

const throttledEventHandler = throttle(() => console.log("event!"), 2000);

window.addEventListener("scroll", throttledEventHandler);

 

 

throttle λ₯Ό μ μš©ν•œ scroll event handler μ˜ˆμ‹œ

 

πŸ“Œ μ°Έκ³  자료

Javascript: ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Debounce ΠΎΡ‚ Throttling | xandeadx.ru

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€