delay, spaceBy & sample

Tres formas de mover eventos en el tiempo: desplazarlos todos, separarlos, o leer solo el más reciente a un ritmo fijo.

FxEvents<T> FxEvents<T>.delay(Duration duration) // chain (events) FxEvents<T> FxEvents<T>.spaceBy(Duration gap) FxEvents<T> FxEvents<T>.sample(Duration period)

Lección

Limitar el ritmo siempre te cuesta algo, y la única pregunta real es qué. throttle y debounce pagan en eventos: se quedan con uno por ventana y descartan el resto, lo cual es correcto cuando los eventos son muestras de algo continuo y uno viejo no vale nada. spaceBy(gap) paga en tiempo: todos los eventos sobreviven, encolados y liberados uno por gap, lo cual es correcto cuando cada evento es una instrucción discreta que no puedes perder — seis mensajes que enviar contra una API que permite una llamada cada 100 ms.

Ese intercambio tiene un filo. Como spaceBy encola en vez de descartar, una fuente que produzca más rápido que gap indefinidamente hace crecer una cola sin límite. Es para ráfagas —un lote que llega de golpe y tiene que pasar entero—, no para una entrada genuinamente interminable, donde perder eventos es justamente la virtud de throttle.

delay(duration) es el más simple de los tres: el stream entero se desplaza una cantidad fija, con su separación intacta y sin descartar nada. El cierre espera a que aterrice el último evento retrasado, así que no se pierde nada al final; los errores se reenvían de inmediato, ya que solo los datos merecen retenerse.

sample(period) es sampleOn con el reloj incorporado: el valor más reciente cada period, en silencio cuando no ha llegado nada nuevo. Échale mano cuando la fuente sea un feed con aire de estado (una posición, una temperatura, un desplazamiento de scroll) y el consumidor tenga su propia tasa de refresco. Capa de eventos de fxdart, siguiendo a delay, interval y sampleTime de Rx.

Demo 1 · Dosificar una ráfaga sin pérdidas

Demo 2 · Desplazar, y leer por reloj

Pruébalo tú

Ejercicio: un ritmo de envío y un ritmo de informe, en una sola cadena.

Relacionado: throttle — la contraparte con pérdidas: un evento por ventana, de inmediato · debounce — espera a que acabe la ráfaga y toma su último valor · chunkEvery — también conserva todos los eventos, pero agrupados en vez de separados