throttle
wait 구간마다 함수를 최대 한 번만 실행합니다 — debounce의 "잠잠해질 때까지 기다리기"와 달리 일정한 주기로 발화합니다.
강의
throttle은 감싼 함수가 아무리 자주 호출되더라도
func가 wait마다 최대 한 번만 실행되도록
보장합니다. debounce와의 결정적인
차이가 여기 있습니다. debounce는 호출이 있을 때마다 타이머를
다시 시작하므로 호출이 끊이지 않으면 실행이 무한정 밀릴 수
있지만, throttle의 구간은 한 번 시작되면 고정이라 호출이 일정한
주기로 계속 통과합니다. 스크롤이나 리사이즈 핸들러처럼 맨 마지막
한 번이 아니라 주기적인 갱신이 필요한 곳에 유용합니다.
leading과 trailing은 둘 다 기본값이
true입니다. 한 구간의 첫 호출은 즉시 발화하고(리딩 에지),
구간이 닫히기 전에 호출이 더 들어오면 그중 마지막 호출이
구간이 끝날 때 한 번 발화합니다(트레일링 에지, 가장 최근 인자로).
둘 중 하나를 끄면 리딩만 또는 트레일링만 동작하게 만들 수 있습니다.
debounce와 마찬가지로 반환되는
Throttled<T>는 호출 가능한 클래스이며, 대기 중인
트레일링 호출을 버리는 .cancel()을 제공합니다.
데모 1 · 리딩 + 트레일링(기본 동작)
첫 호출은 즉시 발화하고, 구간이 닫힐 때 그 구간의 마지막 호출이 한 번 더 발화합니다:
데모 2 · leading/trailing 조절과 cancel()
leading을 끄면 트레일링만, trailing을 끄면
리딩만 동작하고, .cancel()을 호출하면 대기 중인 트레일링
호출을 버립니다.
메서드 표기
debounce와 같습니다.
onScroll.fxThrottle(wait)는
throttle(onScroll, wait)이고,
leading과 trailing도 그대로 전달합니다.
void onScroll(double offset) => _measure(offset);
final handler = onScroll.fxThrottle(
const Duration(milliseconds: 100),
trailing: false,
);
fx 접두사는 감싸는 주체가 어느 라이브러리인지 밝혀 줍니다 —
fx의 getter 표기와 같은 규칙입니다.
직접 해 보기
연습: onClick을 throttle로 감싸(wait는 100ms)
빠르게 이어진 클릭이 세 번이 아니라 최대 두 번 — 리딩과 트레일링 —
만 기록되게 만들어 보세요.
이벤트 스트림에서
같은 아이디어가 이벤트 레이어에도 있습니다. 수다스러운 대상이 콜백이
아니라 Stream이라면
fxEvents(s).throttle(window, trailing: …)이 윈도마다
이벤트 하나만 통과시킵니다. 기본값이 하나 다릅니다: 스트림 형태는
trailing: true를 넘기지 않는 한 리딩 전용입니다(위의
콜백 래퍼는 양쪽 에지가 기본으로 켜져 있습니다). 이 체인이 속한 곳은
fxEvents 문서를 참고하세요.
debounce — 고정된 주기가 아니라 잠잠해지기를 기다립니다 ·
delay & sleep — 타이밍 데모를 만드는 재료 ·
shuffle — 시드를 지정하는 난수 ·
concurrent — 비동기 파이프라인의 속도 제한