Solo importa la búsqueda más nueva
Requisito
Un usuario teclea tres consultas — fx, luego
fxdar 40 ms después, luego fxdart tras
una pausa. Cada búsqueda tarda 150 ms, así que la segunda
consulta llega mientras la primera búsqueda sigue en vuelo: el primer
resultado debe descartarse, jamás mostrarse. Imprime solo los
resultados supervivientes, y luego cuántas búsquedas arrancaron
frente a cuántas se entregaron. El calendario está simulado en el
código; las dos versiones deben imprimir las líneas que aparecen bajo
Salida esperada.
Salida esperada
7 results for "fxdar" 12 results for "fxdart" searches started: 3, results delivered: 2
Lado a lado
RxDart
FxDart
Por qué difieren
No difieren. «Lo más nuevo cancela lo más viejo» es una
afirmación sobre suscripciones, y la capa
fxEvents las tiene: su switchMap
mapea cada consulta a un stream de búsqueda interno y des-suscribe
el anterior en el momento en que llega una consulta más nueva, así
que a un resultado obsoleto no le queda ningún oyente al que llegar.
Arrancan tres búsquedas, sobreviven dos resultados, y nada de esa
lógica aparece en el código del usuario — en ninguno de los dos
paneles. Sin contador de épocas artesanal y sin contabilidad de
terminación.
fxdart absorbe el enfoque Rx exactamente para esta clase de
requisito: fxEvents es una cadena envoltorio fina sobre
Streams llanos — nunca una extensión, así que convive
con cualquier otra biblioteca de streams, rxdart incluido. El
catálogo de operadores de RxDart sigue siendo mucho más amplio;
cuando los resultados supervivientes necesiten procesamiento real
por valor, cruza a la cadena pull tipada con .pull().
Para el caso de uso que define a switchMap, los paneles
son equivalentes operador por operador: 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.