Search

Throttle

Throttle (μ“°λ‘œν‹€)

Throttleμ΄λž€ νŠΉμ • ν•¨μˆ˜κ°€ 일정 μ‹œκ°„ 내에 μ΅œλŒ€ ν•œ 번만 μ‹€ν–‰λ˜λ„λ‘ μ œν•œν•˜λŠ” 기법
μ΄λ²€νŠΈκ°€ 아무리 많이 λ°œμƒν•΄λ„ μ§€μ •ν•œ delay κ°„κ²©λ§ˆλ‹€ λ”± ν•œ 번만 μ‹€ν–‰λ©λ‹ˆλ‹€.

λΉ„μœ 

μˆ˜λ„κΌ­μ§€λ₯Ό 아무리 μ„Έκ²Œ 틀어도, λ°ΈλΈŒκ°€ 200msλ§ˆλ‹€ ν•œ λ²ˆμ”©λ§Œ 물을 ν˜λ €λ³΄λ‚΄λŠ” 것

μ½”λ“œ 뢄석

const throttle = (fn, delay) => { let timer = null // 타이머 ID μ €μž₯ λ³€μˆ˜ return (...args) => { // μ‹€μ œλ‘œ 호좜될 래퍼 ν•¨μˆ˜ λ°˜ν™˜ if (!timer) { // 타이머가 없을 λ•Œλ§Œ μ‹€ν–‰ timer = setTimeout(() => { fn(...args) // delay ν›„ 원본 ν•¨μˆ˜ μ‹€ν–‰ timer = null // 타이머 μ΄ˆκΈ°ν™” β†’ λ‹€μŒ μ‹€ν–‰ ν—ˆμš© }, delay) } // timerκ°€ 있으면 아무것도 ν•˜μ§€ μ•ŠμŒ (λ¬΄μ‹œ) } }
JavaScript
볡사

μ‹€ν–‰ 흐름

슀크둀 이벀트 λ°œμƒ 횟수 β†’ [1] [2] [3] [4] [5] [6] ... ↓ throttle(fn, 200ms) 적용 β†’ [1] λ¬΄μ‹œ λ¬΄μ‹œ λ¬΄μ‹œ [5] λ¬΄μ‹œ ... ↑ ↑ μ¦‰μ‹œ μ‹€ν–‰ 200ms ν›„ μ‹€ν–‰
Plain Text
볡사

Throttle vs Debounce 비ꡐ

ꡬ뢄
Throttle
Debounce
λ™μž‘
일정 κ°„κ²©λ§ˆλ‹€ ν•œ 번 μ‹€ν–‰
λ§ˆμ§€λ§‰ 호좜 ν›„ 일정 μ‹œκ°„ λ’€ μ‹€ν–‰
μ ν•©ν•œ 경우
슀크둀, λ¦¬μ‚¬μ΄μ¦ˆ, 마우슀 이동
검색창 μž…λ ₯, λ²„νŠΌ 쀑볡 클릭 λ°©μ§€
쀑간 μ‹€ν–‰
있음 (주기적으둜 μ‹€ν–‰)
μ—†μŒ (λλ‚˜μ•Ό μ‹€ν–‰)

μ˜ˆμ‹œλ‘œ μ΄ν•΄ν•˜κΈ°

이벀트: ─────────────────────────────────────────▢ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ Throttle: ↑ ↑ ↑ ↑ ↑ (200msλ§ˆλ‹€ ν•œ λ²ˆμ”© μ‹€ν–‰) Debounce: ↑ (μ΄λ²€νŠΈκ°€ λ©ˆμΆ”κ³  λ‚˜μ„œ 200ms ν›„ ν•œ 번만 μ‹€ν–‰)
Plain Text
볡사

μ‹€μ œ μ‚¬μš© 예 (List.jsx)

// 200msλ§ˆλ‹€ ν•œ 번만 handleScroll μ‹€ν–‰ const handleScroll = throttle(() => { const { scrollHeight, scrollTop, clientHeight } = element const isScrollingDown = scrollTop > prevScrollTop.current prevScrollTop.current = scrollTop if (isScrollingDown && clientHeight + scrollTop >= scrollHeight - 1) { addPage(nextPage) // λ‹€μŒ νŽ˜μ΄μ§€ λ‘œλ“œ } }, 200) element.addEventListener('scroll', handleScroll)
JavaScript
볡사
슀크둀 μ΄λ²€νŠΈλŠ” 1μ΄ˆμ— μˆ˜μ‹­~수백 번 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. Throttle을 μ μš©ν•˜μ§€ μ•ŠμœΌλ©΄ addPage()κ°€ 극히 짧은 μ‹œκ°„μ— μˆ˜μ‹­ 번 ν˜ΈμΆœλ˜μ–΄ μ„œλ²„ κ³ΌλΆ€ν•˜ λ˜λŠ” 쀑볡 μš”μ²­μ΄ λ°œμƒν•©λ‹ˆλ‹€.

라이브러리 ν™œμš©

μ‹€λ¬΄μ—μ„œλŠ” 직접 κ΅¬ν˜„ν•˜μ§€ μ•Šκ³  lodash 라이브러리λ₯Ό 주둜 μ‚¬μš©ν•©λ‹ˆλ‹€.
npm install lodash
Bash
볡사
import { throttle } from 'lodash' const handleScroll = throttle(() => { // ... }, 200)
JavaScript
볡사