Aplicar debounce al buscador

Empate async

Requisito

Un usuario teclea f, fx, fxd en una ráfaga rápida, hace una pausa, y luego teclea fxdart. Busca solo cuando el tecleo haya estado en silencio 160 ms — de modo que corren exactamente dos búsquedas (fxd y fxdart) — e imprime cada resultado. El calendario de pulsaciones está simulado en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
3 results for "fxd"
12 results for "fxdart"

Lado a lado

RxDart

FxDart

Por qué difieren

No difieren. Este es un problema push en su forma más pura — lo interesante no son los valores sino cuándo dejan de llegar — y ambos paneles lo dicen de la misma manera: aplicar debounce al stream de eventos con 160 ms, buscar cada consulta superviviente, recoger. RxDart lo escribe debounceTime; fxdart lo escribe fxEvents(...).debounce(...). Operador por operador, las dos cadenas son equivalentes, hasta en el valor final vaciado al cerrar.

Es deliberado: la capa de eventos de fxdart absorbió el enfoque Rx para el lado push. fxEvents es una cadena envoltorio fina sobre Streams de Dart llanos — nunca una extensión, así que no colisiona con nada, rxdart incluido — que da a los operadores basados en tiempo un hogar que los pipelines pull con razón se negaron a ser. El catálogo de operadores de RxDart sigue siendo mucho más amplio; fxdart cubre los verbos push cotidianos y se detiene ahí. Y cuando las consultas con debounce deban alimentar trabajo tipado y dirigido por demanda — fetches concurrentes ordenados, manejo de errores tipado — .pull() es la puerta de vuelta al pipeline FxAsync.

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.