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.

FxEvents<T> FxEvents<Stream<T>>.switchLatest() FxEvents<T> FxEvents<Stream<T>>.flattenMerge({int? concurrent}) FxEvents<T> FxEvents<Stream<T>>.flattenConcat() FxEvents<T> FxEvents<Stream<T>>.exhaustLatest() FxEvents<T> concatEager<T>(Iterable<Stream<T>> sources)

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.

Relacionado: switchMap — la forma mapeada de switchLatest · mergeMap — mergeMap, concatMap, exhaustMap · FxEvents.concat — el hermano que se suscribe después de concatEager