waitAll, zip & friends

Combinar muchos streams en uno: esperarlos a todos, emparejarlos por índice, reproducirlos en secuencia o dejar que compitan.

static FxEvents<List<T>> FxEvents.waitAll<T>(Iterable<Stream<T>> sources) static FxEvents<R> FxEvents.zip<T, R>(Iterable<Stream<T>> sources, R Function(List<T>) combine) static FxEvents<List<T>> FxEvents.combineLatestAll<T>(Iterable<Stream<T>> sources) static FxEvents<T> FxEvents.concat<T>(Iterable<Stream<T>> sources) FxEvents<R> FxEvents<T>.zipWith<U, R>(Stream<U> other, R Function(T, U) combine) FxEvents<T> FxEvents<T>.followedBy(Stream<T> next) // chain (events) FxEvents<T> FxEvents<T>.mergeWith(Stream<T> other) FxEvents<T> FxEvents<T>.raceWith(Stream<T> other)

Lección

FxEvents.waitAll(sources) es el Future.wait de los streams. Emite exactamente un evento — una lista con el último valor de cada fuente, en el orden de las fuentes — en cuanto todas se han cerrado, y luego se cierra él. Ese es el caso del panel de control: tres paneles cargan de forma independiente y la pantalla se dibuja cuando entra el más lento. Una fuente que se cierra sin haber emitido nada significa que no hay resultado completo que informar, así que no se emite nada en absoluto.

FxEvents.zip empareja las fuentes por índice: el 1.er evento de cada fuente junto, luego el 2.º de cada una, y así sucesivamente. La fuente que va por delante se almacena hasta que la más lenta la alcanza, y el resultado se cierra en cuanto una fuente cerrada se queda sin búfer: ya no puede formarse ningún par más. zipWith es la forma de dos fuentes y, a diferencia de la estática basada en listas, puede emparejar tipos distintos.

Merece la pena poner zip y combineLatest uno al lado del otro, porque son las dos mitades de «combinar dos streams» y la gente echa mano del equivocado constantemente. zip empareja por posición: el 3.º de A siempre se encuentra con el 3.º de B, tarde lo que tarde. combineLatest empareja por tiempo: cualquier evento vuelve a emitir con lo que el otro lado tenga en ese momento, así que una fuente puede aparecer en muchas salidas y otra en ninguna. combineLatestAll es su forma N-aria.

Los demás son secuenciación más que combinación. FxEvents.concat reproduce cada fuente hasta el final antes de empezar la siguiente; followedBy es su forma de dos fuentes, llamada así por el propio Iterable.followedBy de Dart. mergeWith y raceWith son las formas de instancia de FxEvents.merge y FxEvents.race. Capa de eventos de fxdart, siguiendo a forkJoin, zip, combineLatestList y concat de Rx.

Demo 1 · Esperar a cada panel

Demo 2 · Por posición o por tiempo

Pruébalo tú

Ejercicio: secuenciación — concat, followedBy, raceWith, mergeWith.

Relacionado: combineLatest — el emparejado por tiempo, y el que normalmente quieres para el estado de la UI · race — gana la primera fuente que habla, las demás se cancelan · zip — el original de la capa pull, que empareja Iterables por índice