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.
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.
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