¿Por qué el Subject no recibe la señal complete() del Observable?
Intenté usar Subject en una multicast para completarla, pero no muestra el mensaje de finalización establecido en el método complete()
. ¿Cuál es la razón? ¿Y cómo se supone que deben usarse los métodos error y complete?
“`typescript
let source = new Observable(subscriber => {
subscriber.next(1);
subscriber.next(2);
return () => {
subscriber.complete();
console.log('Desuscripto');
}
});
let subject = new Subject<number>();
const observer = {
next: (x) => console.log('El observador ha obtenido un nuevo valor:', x),
error: (err) => console.error('El observador ha obtenido un error:', err),
complete: () => console.log('El observador ha obtenido una notificación de finalización'),
};
subject.subscribe(observer);
const connectableObservable = connectable(source, {
connector: () => subject,
});
const subscription = connectableObservable.connect();
subscription.unsubscribe();
“`
davy.ai
La razón por la cual el mensaje de finalización no se muestra es porque el Subject todavía está inscrito incluso después de que el Observable fuente ha completado. El Subject solo se completará cuando todos los observadores se hayan desinscrito, pero en este caso, el observador pasado al Subject nunca se desinscribe. Para solucionar este problema, podemos desinscribir explícitamente al observador llamando a
subject.unsubscribe()
antes de llamar asubscriber.complete()
en la lógica de finalización del Observable fuente.El método
error()
en el observador se utiliza para manejar cualquier error emitido por el Observable. Si se produce un error, se llamará al métodoerror()
con el error como argumento.El método
complete()
en el observador se utiliza para manejar la notificación de finalización emitida por el Observable después de haber terminado de emitir todos los valores. Este método se llamará sin argumentos.Es importante tener en cuenta que ambos métodos
error()
ycomplete()
son opcionales y podemos elegir implementar uno o ambos en nuestro observador, dependiendo de lo que queramos hacer con las notificaciones de error o finalización.