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.
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.
fxEvents ·
debounce ·
switchMap ·
mapEither ·
fetch concurrente acotado — el trabajo de I/O ·
RxDart vs FxDart: debounce