Aplicar throttle al botón de refresco

Empate async

Requisito

Un usuario machaca el botón de refresco: toques en 0/50/100/400/450/800 ms. Deja pasar como mucho un refresco por ventana de 300 ms, tomando el primer toque de cada ventana — de modo que se disparan exactamente tres refrescos (toques 0, 3 y 5). Imprime qué toques pasaron después de que el stream se cierre. El calendario de toques está simulado en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
refresh fired on tap 0
refresh fired on tap 3
refresh fired on tap 5
taps: 6, refreshes: 3

Lado a lado

RxDart

FxDart

Por qué difieren

No difieren. El throttling es limitar la tasa de llegadas en el tiempo — una propiedad de cuándo ocurren los eventos, no de los valores — y ambos paneles colapsan el requisito en un solo operador sobre el stream de toques. El throttleTime(300ms) de RxDart y el fxEvents(...).throttle(300ms) de fxdart implementan la misma ventana de borde inicial (el primer toque emite y abre la ventana, el resto de la ráfaga se traga; el borde final está a una bandera de distancia en cualquiera de los dos lados), con la suscripción, la contabilidad de ventanas y la terminación todas dentro del operador.

fxdart absorbe deliberadamente el enfoque Rx para el lado push: fxEvents es una cadena envoltorio sobre Streams llanos — no una extensión, así que convive con cualquier biblioteca de streams sin un solo conflicto de miembros. El catálogo de operadores de RxDart sigue siendo mucho más amplio que la capa de eventos de fxdart; para los verbos temporales cotidianos como este, los dos son intercambiables. Si cada toque superviviente tuviera luego que disparar trabajo async real y tipado, .pull() llevaría el stream al pipeline FxAsync dirigido por demanda.

Benchmark

Sin benchmark para este ejemplo. Este operador se define por el tiempo transcurrido, no por el trabajo realizado: ambos lados esperan las mismas ventanas, así que una barra estaría midiendo los temporizadores de Dart y no las librerías. Acortar las ventanas tampoco sirve — cuántos valores produce una ráfaga pasaría a depender de lo rápida que sea la máquina, y ya no se podría comprobar que ambos lados dan un resultado idéntico. Por eso los ejemplos construidos sobre operadores de temporización se dejan sin medir; los que solo usan retardos para simular E/S sí se miden, con esos retardos puestos a cero.