waitAll, zip & friends
Combinar muchos streams en uno: esperarlos a todos, emparejarlos por índice, reproducirlos en secuencia o dejar que compitan.
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.
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