Búsqueda con debounce

Primero el tiempo, luego gana lo más reciente, luego un parse tipado. Una cadena. El empate con RxDart es a propósito — el punto es que no necesitas un segundo paquete.

fxEvents(keystrokes) .debounce(Duration) // wait for quiet .switchMap(search) // latest query wins .mapEither((r, hit) => parse) // failure as a Left

Lección

Una caja de búsqueda no es una lista. Las pulsaciones llegan cuando llegan, una ráfaga debería colapsarse a la última consulta, y una petición que aún esté en vuelo cuando aterriza la siguiente consulta debería cancelarse — si no, un «da» lento puede pisar un «dart» rápido. Eso es un trabajo push: fxEvents + debounce + switchMap.

La comparación con RxDart del mismo trabajo es un empate. El debounceTime de rxdart es la misma idea. La afirmación de FxDart aquí no es velocidad — no puedes ganar a esperar — es que la capa de eventos vive en el mismo import que los pipelines pull y el sistema de errores tipados, así que el siguiente paso (parsear el acierto, quedarte con un Left en vez de lanzar) no arranca una librería nueva.

mapEither ejecuta cada resultado entregado en un ámbito raise. Un payload malo se convierte en un Left; las consultas posteriores siguen llegando. Pon attempt en la fuente solo cuando un throw deba convertirse en un valor — y si la cadena también reintenta, attempt va después de retryOn, nunca antes.

Demo 1 · espera a que la escritura se calme

El calendario de pulsaciones está simulado: una ráfaga, una pausa, una consulta más. debounce(160ms) emite dos veces — fxd y fxdart — el mismo contrato que la página de comparación.

Demo 2 · gana la consulta más reciente, luego un parse tipado

switchMap arranca una búsqueda por consulta y cancela el stream interno anterior. mapEither luego nombra un acierto ausente como un Left en vez de lanzar. Ambas búsquedas arrancan; solo se entrega el resultado más reciente.

Relacionado: which surface — por qué esto es push · fxEvents · debounce · switchMap · mapEither · fetch concurrente acotado — el trabajo de I/O · RxDart vs FxDart: debounce