switchLatest, flattenMerge & friends
Un stream de streams, aplanado: quédate con el más nuevo, ejecútalos todos, reprodúcelos en orden, o ignora los de más — y arranca fuentes posteriores de inmediato con concatEager.
Lección
A veces los eventos ya son streams internos — un socket
por sesión, una petición ya construida. No hay mapper que escribir;
la única pregunta es la política de aplanado. Eso es lo que son estas
formas identidad:
switchLatest es
switchMap((s) => s),
flattenMerge es
mergeMap,
flattenConcat es concatMap,
exhaustLatest es exhaustMap. Un
FxEvents de FxEvents se aplana como
.map((e) => e.stream).switchLatest().
switchLatest refleja solo el stream interno más nuevo: uno
fresco cancela el anterior en pleno vuelo. Úsalo
cuando los internos viejos se vuelven inútiles — el feed de la pestaña
actual, los resultados de la consulta actual. La cadena se cierra cuando el externo se ha cerrado
y el último interno completa.
Los otros tres son el resto de la tabla de políticas.
flattenMerge ejecuta todos los internos a la vez (acota con
concurrent: n);
flattenConcat reproduce cada uno hasta el final antes de que empiece el siguiente;
exhaustLatest se queda con el primero e ignora
los internos que llegan mientras uno sigue en marcha.
concatEager es el hermano de
FxEvents.concat. Ambos emiten
en el orden de la fuente, pero concat espera a suscribirse a la siguiente
fuente hasta que la actual completa — una fuente posterior fría ni
siquiera ha arrancado. concatEager se suscribe a todas las
fuentes de inmediato y almacena en búfer los eventos posteriores hasta que les toca. Así
es como arrancas una petición ahora y aun así reproduces las respuestas en
orden. Capa de eventos de fxdart, siguiendo a switchAll,
mergeAll, concatAll,
exhaustAll y concatEager de Rx.
Demo 1 · switchLatest — gana el interno más nuevo
Demo 2 · flattenConcat frente a switchLatest
Pruébalo tú
Ejercicio: concatEager frente a concat — las posteriores arrancan de inmediato.
switchMap — la forma mapeada de switchLatest ·
mergeMap — mergeMap, concatMap, exhaustMap ·
FxEvents.concat — el hermano que se suscribe después de concatEager