delay, spaceBy & sample
이벤트를 시간축에서 옮기는 세 가지 방법: 전부 미루거나, 넓게 펼치거나, 고정된 시계로 최신 것만 읽거나.
강의
속도 제한은 언제나 무언가를 대가로 치르고, 진짜 질문은 무엇을
치르느냐입니다. throttle과
debounce는
이벤트로 치릅니다: 창마다 하나를 남기고 나머지를
버리는데, 이벤트가 연속적인 무언가의 표본이고 오래된 것이 쓸모없을
때 옳습니다. spaceBy(gap)는 대신 시간으로
치릅니다: 모든 이벤트가 살아남아 큐에 들어가고 gap마다
하나씩 풀려납니다. 각 이벤트가 잃어서는 안 되는 개별 명령일 때 —
100ms에 한 번만 허용하는 API로 보낼 메시지 여섯 개 — 옳습니다.
그 거래에는 날카로운 모서리가 있습니다. spaceBy는
버리지 않고 큐에 쌓으므로, gap보다 빠르게 영원히
생산하는 소스는 무한히 자라는 큐를 만듭니다. 이것은
버스트를 위한 것입니다 — 한꺼번에 도착했고 전부 통과해야
하는 묶음 — 진짜로 끝없는 입력을 위한 것이 아닙니다. 그럴 때는
throttle의 손실성이 오히려 기능입니다.
delay(duration)은 셋 중 가장 단순합니다: 스트림 전체가
고정된 양만큼 밀리고, 간격은 그대로이며, 아무것도 버려지지
않습니다. 닫기는 마지막으로 미뤄진 이벤트가 도착하기를 기다리므로
끝에서 잃는 것이 없고, 에러는 즉시 전달됩니다 — 붙들어 둘 가치가
있는 것은 데이터뿐이니까요.
sample(period)는 시계가 내장된
sampleOn입니다 —
period마다 최신 값, 새로운 것이 없으면 침묵. 소스가
상태 같은 피드(위치, 온도, 스크롤 오프셋)이고 소비자가 자기 갱신
주기를 가질 때 꺼내 쓰세요. fxdart 이벤트 레이어, Rx의
delay, interval, sampleTime을
따랐습니다.
데모 1 · 버스트를 손실 없이 조절하기
데모 2 · 미루기, 그리고 시계로 읽기
직접 해 보기
연습: 전송 속도와 보고 속도를 한 체인에.
throttle — 손실이 있는 대응물: 창마다 하나, 즉시 ·
debounce — 버스트가 끝나기를 기다렸다가 마지막 값 취하기 ·
chunkEvery — 역시 모든 이벤트를 지키되, 펼치는 대신 묶기