Un valor actual en vivo para lectores tardíos

Empate async

Requisito

Un feed de temperatura empuja actualizaciones con un calendario fijo. Un panel se conecta solo después de que las tres primeras actualizaciones ya hayan pasado — aun así debe mostrar el valor actual de inmediato (19.1 °C, el más reciente en el momento de unirse), y luego cada actualización posterior. El calendario está simulado en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
joined late, current: 19.1
update: 19.5
update: 20.0

Lado a lado

RxDart

FxDart

Por qué difieren

No difieren. «El último valor, reemitido a quien aparezca» es estado compartido y multicast, y fxdart también tiene un objeto dedicado para ello: LiveValue es BehaviorSubject reducido a su comportamiento definitorio — un sumidero en el que el sensor escribe, un .value legible, y un feed donde un suscriptor tardío recibe primero el valor más reciente, y luego las actualizaciones en vivo. Ambos paneles son «añadir actualizaciones, suscribirse tarde, recoger» — sin variable cacheada a mano y sin oyente extra de caché.

Esta es la capa de eventos de fxdart absorbiendo el enfoque Rx para el lado push: LiveValue.live devuelve una cadena fxEvents — un envoltorio fino sobre un Stream broadcast llano, así que no colisiona con nada, rxdart incluido — y .pull() cruza al pipeline pull tipado cuando el procesamiento por valor crece. La familia de subjects y el catálogo de operadores de RxDart siguen siendo mucho más amplios; para el último-valor-y-luego-en-vivo en sí, los paneles son equivalentes: empate.

Benchmark

Sin benchmark para este ejemplo. Este operador se define por el tiempo transcurrido, no por el trabajo realizado: ambos lados esperan las mismas ventanas, así que una barra estaría midiendo los temporizadores de Dart y no las librerías. Acortar las ventanas tampoco sirve — cuántos valores produce una ráfaga pasaría a depender de lo rápida que sea la máquina, y ya no se podría comprobar que ambos lados dan un resultado idéntico. Por eso los ejemplos construidos sobre operadores de temporización se dejan sin medir; los que solo usan retardos para simular E/S sí se miden, con esos retardos puestos a cero.