shareReplay, ReplayValue & CompletionValue
Multicast que recuerda: un búfer de replay acotado, un último valor al cerrar, y el operador de cadena que envuelve una fuente con ambos.
Lección
share difunde una sola ejecución a
muchos oyentes y después olvida. Un oyente que llega después de que un
evento haya pasado se lo ha perdido. ReplayValue es el
subject que recuerda: add añade a un búfer
recortado por size (por defecto 1; null es
ilimitado) y maxAge, y cada
suscriptor tardío reproduce primero el búfer retenido,
y después se sube a las actualizaciones en vivo. Los errores no se
retienen. Tras
close, un oyente tardío sigue recibiendo el búfer, y luego
el cierre. Capa de eventos de fxdart, siguiendo al
ReplaySubject de Rx.
CompletionValue es la otra memoria:
add solo recuerda, y el último valor se emite
al cerrar — nada mientras está abierto, luego ese valor
y el cierre. Un oyente tardío tras el cierre recibe lo mismo. Un
addError completa de inmediato con el error, no con un
valor recordado. El AsyncSubject de Rx.
LiveValue, a continuación, es el
subject de valor actual con una lectura síncrona
.value — un ReplayValue de tamaño 1 sin el
getter.
connectable() es la forma manual: devuelve un
ConnectableEvents cuyo feed events no
suscribe la fuente hasta connect().
Los oyentes enganchados de antemano esperan; los oyentes tardíos se pierden los valores ya
emitidos. refCount() conecta con el primer
oyente y desconecta con el último, reconectando cuando la
fuente permite un segundo listen. shareReplay es la
forma habitual: multicast a través de un ReplayValue,
conexión en el primer oyente, oyentes tardíos ven el historial.
resetOnCancel (por defecto true) arranca un
búfer fresco cuando el último oyente se va;
false deja la fuente conectada para siempre.
Capa de eventos de fxdart, siguiendo a ReplaySubject,
AsyncSubject, ConnectableObservable
y shareReplay de Rx.
Demo 1 · Un suscriptor tardío ve el búfer
Demo 2 · CompletionValue emite al cerrar
Pruébalo tú
Ejercicio: shareReplay sobre un fromIterable, dos oyentes.