rxjs - first - Diferencia entre.suscribirse al.take(1)
take observable rxjs (1)
Cada uno tiene un propósito diferente por lo que es difícil compararlos.
En general si tomas esta fuente:
const source = Observable.range(1,3);
y consumirlo con subscribe()
seguido inmediatamente por unsubscribe()
:
source.subscribe(
console.log,
undefined,
() => console.log(''complete'')
).unsubscribe();
Entonces, todos los valores de la fuente se emitirán aunque yo haya llamado a unsubscribe()
justo después de suscribirme. Esto se debe a que el código sigue siendo estrictamente secuencial y la source
es un observable frío.
1
2
3
complete
Por cierto, intente agregar el .delay(0)
para crear source.delay(0).subscribe(...).unsubscribe()
y vea qué sucede. Esto hace que la emisión de valores a las devoluciones de llamada del suscriptor sea asincrónica utilizando una llamada setTimout()
real y, por este motivo, se llama a unsubscribe()
antes de que llegue a las devoluciones de llamada y se descarta inmediatamente porque ya hemos cancelado la suscripción.
En otras palabras, unsubscribe()
permite dejar de recibir valores en cualquier momento. Incluso cuando la fuente no ha emitido todos los valores (nunca recibimos ninguna llamada completa).
Usar el operador take()
limita la cadena para emitir solo un número específico de valores.
source.take(1).subscribe(
console.log,
undefined,
() => console.log(''complete'')
);
Esto solo emite un valor único y completa:
1
complete
Incluso si agrega .unsubscribe()
el resultado sería el mismo.
Vea una demostración en vivo: https://jsbin.com/copujo/4/edit?js,console
Por lo tanto, take()
es un operador que encadena los Observables, mientras que unsubscribe()
es un método en el objeto de Subscription
. Estas dos cosas son a menudo intercambiables, pero creo que nunca se sustituyen por completo.
Me pregunto, si hay alguna diferencia en el rendimiento entre el uso de .take(1)
y .unsubscribe
cuando se usa la unsubscribe
la suscripción justo después de la suscripción:
var observable = Rx.Observable.interval(100);
Primero:
var subscription = observable.subscribe(function(value) {
console.log(value);
}).unsubscribe();
Segundo:
var subscription = observable.take(1).subscribe(function(value) {
console.log(value);
});
¿Alguna idea de ello hace diferente al rendimiento?