새로고침 버튼 스로틀링하기
요구사항
사용자가 새로고침 버튼을 연타합니다: 0/50/100/400/450/800 ms 시점의 탭들. 300 ms 윈도당 최대 한 번의 새로고침만 통과시키되, 각 윈도의 첫 탭을 취하세요 — 그래서 정확히 세 번의 새로고침이 발동합니다(탭 0, 3, 5). 스트림이 닫힌 뒤 어느 탭들이 통과했는지 출력합니다. 탭 스케줄은 코드에 시뮬레이션되어 있습니다; 두 버전 모두 예상 출력 아래에 표시된 줄들을 출력해야 합니다.
예상 출력
refresh fired on tap 0 refresh fired on tap 3 refresh fired on tap 5 taps: 6, refreshes: 3
나란히 보기
RxDart
FxDart
차이가 나는 이유
다르지 않습니다. 스로틀링은 시간 속의 도착에 대한
속도 제한 — 값이 아니라 이벤트가 언제 일어나는가의 속성 — 이고,
두 패널 모두 요구사항을 탭 스트림 위의 연산자 하나로
접습니다. RxDart의 throttleTime(300ms)과 fxdart의
fxEvents(...).throttle(300ms)은 같은 리딩 엣지 윈도를
구현하며(첫 탭이 값을 내보내며 윈도를 열고, 연타의 나머지는
삼켜집니다; 트레일링 엣지는 양쪽 모두 플래그 하나 거리에
있습니다), 구독, 윈도 장부 정리, 완료가 모두 연산자 안에서
처리됩니다.
fxdart는 push 쪽을 위해 Rx의 접근을 의도적으로 흡수해
여기에 도달했습니다: fxEvents는 평범한
Stream 위의 래퍼 체인으로 — extension이 아니어서 멤버
충돌 하나 없이 어떤 스트림 라이브러리와도 공존합니다. RxDart의
연산자 카탈로그는 fxdart의 이벤트 레이어보다 여전히 훨씬 큽니다;
이 예제 같은 일상적인 시간 동사들에서는 둘이 서로 대체
가능합니다. 살아남은 각 탭이 이어서 진짜 타입 있는 비동기 작업을
발동해야 한다면, .pull()이 스트림을 요구 주도
FxAsync 파이프라인으로 실어 갈 것입니다.
벤치마크
이 예제에는 벤치마크가 없습니다. 이 연산자는 처리한 일의 양이 아니라 흘러간 시간으로 정의됩니다. 양쪽 모두 똑같은 시간 창을 기다리므로, 막대는 두 라이브러리가 아니라 Dart의 타이머를 재게 됩니다. 시간 창을 줄여도 해결되지 않습니다 — 그러면 한 번의 이벤트 폭주에서 몇 개의 값이 나오는지가 머신 속도에 좌우되고, 두 구현이 같은 결과를 냈는지 대조할 수 없게 되기 때문입니다. 타이밍 연산자로 만들어진 예제들을 측정하지 않고 두는 이유가 이것입니다. 지연이 그저 I/O를 흉내 낼 뿐인 예제들은 그 지연을 0으로 두고 벤치마크합니다.