switchMap
Mapea cada evento a un stream interno y refleja solo el más nuevo — un evento fresco cancela el stream interno anterior en pleno vuelo.
Lección
El bug de la caja de búsqueda que toda UI ha enviado al menos una vez:
el usuario teclea da, luego dart; la petición
de da es más lenta; sus resultados obsoletos llegan los
últimos y pisan los buenos. La solución no es ignorar la
respuesta vieja sino hacerla imposible: switchMap(f) mapea
cada evento a un stream interno y, en el momento en que llega un evento
más nuevo, cancela de raíz el stream interno anterior.
Solo el stream interno más nuevo se refleja aguas abajo.
La cancelación por novedad es una política, y es la correcta exactamente
cuando el trabajo viejo se vuelve inútil en cuanto existe
entrada más nueva — búsqueda, autocompletado, navegación, «cargar los
detalles de la fila seleccionada». Es la equivocada cuando la salida de
cada stream interno importa (una subida por archivo, digamos) — ese es
un trabajo de fan-out para el
mapConcurrent del lado
pull, donde nada se cancela.
Semántica en los bordes: la cadena se cierra cuando la fuente se ha
cerrado y el último stream interno completa — que la fuente
termine nunca corta el trabajo que ya está en pantalla. Un mapper que
lanza se convierte en un evento de error y la fuente sigue adelante.
Capa de eventos de fxdart, según el switchMap de Rx.
Demo 1 · La caja de búsqueda, arreglada
Demo 2 · El último stream interno termina de decir lo suyo
Pruébalo tú
Ejercicio: autocompletado que no puede mostrar sugerencias obsoletas.
debounce — su pareja natural aguas arriba: menos consultas de entrada, cero resultados obsoletos de salida ·
race — cancelación entre streams hermanos en lugar de sucesivos ·
mapConcurrent — cuando cada resultado importa, fan-out del lado pull