Poner a competir dos mirrors

Empate async

Requisito

El mismo payload está disponible desde dos mirrors: el mirror de la UE responde en 60 ms, el de EE. UU. en 180 ms. Obtenlo lo más rápido posible y asegúrate de que el fetch lento no corre hasta completarse — demuéstralo contando los fetches completados bien después de la fecha límite del perdedor. Los mirrors están simulados en el código como streams cancelables; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
winner: payload from eu-mirror
completed fetches: 1
loser fetch completed: false

Lado a lado

RxDart

FxDart

Por qué difieren

No difieren. La carrera es una idea push — suscríbete a todo, quédate con quien hable primero, cancela el resto — y FxEvents.race es exactamente eso, igualando a Rx.race movimiento a movimiento: ambos mirrors están genuinamente en vuelo, y en el momento en que el mirror de la UE emite a los 60 ms la suscripción de EE. UU. se cancela, su onCancel se dispara, y el temporizador pendiente muere. Ambos paneles lo demuestran de la misma manera — el conteo de fetches completados sigue siendo 1 mucho después de la fecha límite de 180 ms del perdedor. El trabajo se detuvo, no solo se ignoró, en ambos lados.

Una cadena pull solo puede negarse a arrancar el fetch de respaldo, nunca cancelar uno en vuelo; la capa de eventos absorbe en cambio el enfoque Rx: una cadena envoltorio fina sobre Streams llanos que no colisiona con nada, rxdart incluido. El catálogo de operadores de RxDart sigue siendo mucho más amplio — fxdart mantiene pequeño el núcleo de eventos y entrega el procesamiento por valor del ganador al lado pull tipado vía .pull(). Para «gana el primero en responder, los perdedores se cancelan», los dos 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.