javascript - attribute - title html
¿Cuál es el caso de uso de los observables en frío? (3)
¿Cuál es el caso en el que prefiere o usa un frío observable en lugar de uno caliente?
Espero no indicar lo obvio, sino cualquier situación en la que desee acceder a todos los valores (o algún subconjunto al filtrar el conjunto completo) del historial de un observable.
El primer ejemplo que viene a la mente es promediar todas las calificaciones de los exámenes de un estudiante, no solo las calificaciones que han llegado después de haberse suscrito.
Entiendo las diferencias entre los observables fríos y calientes, pero siempre veo personas que usan observables calientes en lugar de fríos; de hecho, si alguien usa accidentalmente un frío observable, se considera un error, ya que a menudo es causa de comportamientos no deseados.
¿Cuál es el caso en el que prefiere o usa un frío observable en lugar de uno caliente?
El núcleo de la respuesta se encuentra en el resumen lacónico de Ben Lesh:
TL; DR: Desea un HOT observable cuando no desea crear su productor una y otra vez.
En respuesta directa a la pregunta "¿Qué es un caso en el que preferiría o usaría un frío observable en lugar de uno caliente?", Ofreceré una respuesta general y un ejemplo específico.
En general, es mucho más conveniente usar un observable frío para modelar flujos que se crean cada vez que se requieren que crear uno caliente y tratar de disputarlo.
Específicamente, considere el siguiente ejemplo trivial. Diga que desea responder a un clic en un botón contando hacia abajo desde 10. Si se vuelve a hacer clic en el botón durante la cuenta regresiva, comienza nuevamente en 10. Si hace clic en $ modela los eventos del botón, es posible que tenga algo como esto:
const subscription = click$
.flatMapLatest(_ => Rx.Observable.interval(1000).take(10))
.select(x => 10 - x)
.subscribe(x => console.log(''clicked: '' + x));
Considere cómo se modelaría esto sin un frío observable. Como tu
- ¿Inicializar un flujo por adelantado para que los valores apropiados estén disponibles cuando sea necesario?
- ¿Evite tener que lidiar con la fracción de segundo entre las marcas de intervalo y el momento de su suscripción?
- ¿Tratar con ordinales que pueden comenzar con cualquier número en lugar de solo 1?
- ¿Gestionar la lógica de limpieza para el flujo?
1 y 3 pueden abordarse con bastante facilidad, pero 2 y 4 son desagradables.
En respuesta a su segunda pregunta "¿Es la pereza?" Yo diría que no lo es. Un frío observable puede dejarlo hasta el momento de la suscripción para producir sus valores. Un observable caliente puede dejarlo hasta el momento de la suscripción para enganchar los eventos apropiados. Ambos son perezosos a su manera (o al menos pueden serlo). La diferencia clave radica en lo que dijo Ben Lesh: ¿quieres crear un productor cada vez? Y a veces, realmente lo haces.
En primer lugar, los invito a revisar los observables de frío y caliente: ¿hay operadores ''calientes'' y ''fríos''? para asegurarse de que tiene un conocimiento profundo de lo caliente contra lo frío.
Los observables fríos permiten la pereza de los productores, y esta es una característica muy deseable. Es un desperdicio producir valores (la producción podría ser costosa) cuando no se hace uso de esos valores (no hay consumidores). Como tales observables fríos son el bloque de construcción ... del cual se derivan más a menudo observables en caliente.
Como tal, el caso de uso más común para los observables fríos es obtener perezosamente observables calientes. Si lo piensas bien, necesitas construir programáticamente estos observables calientes de alguna manera. Una forma es usar los sujetos (tú eres el productor). La otra forma es derivarlos de otros observables preexistentes a través de operadores, observables preexistentes que también se derivan de otros, etc. Al final de la cadena, debe encontrar Rx.Observable.create
y eso es un frío observable.
Se usa frío observable cuando se necesita pereza (comenzar a producir valores solo cuando hay consumidores o controlar el inicio del proceso de producción). Por ejemplo, defer
permite iniciar un productor solo cuando hay un consumidor. Se puede usar cuando tienes, por ejemplo, un observable caliente, pero aún no estás listo para escucharlo.
También necesita observables fríos cuando necesita reproducir un proceso de producción de valor (cada nuevo suscriptor reiniciará el mismo proceso exacto). Este es, por ejemplo, el caso para propósitos de prueba, donde desea utilizar la misma secuencia varias veces pero con diferentes consumidores y en diferentes momentos.
Al final, la pregunta suena más como una filosófica. Tiene dos herramientas a su disposición, lo que importa es entender lo que necesita, lo que tiene y cuál funciona para su caso de uso.