angular - Cómo saber si un Observable cambió de valor o se estableció el valor final
Tengo una variable de tipo returnDate: Observable<string> cuyo valor se establece a partir de otra función de tipo Observable, que se ve algo así:
getDates(): Observable<string> {
return new Observable((observer) => {
observer.next(moment(this.data.Date).format('DD MMM'));}
});
}
Ahora, ¿cómo puedo detectar o saber si el valor de returnDate ha sido cambiado o si el observable ha recibido otro valor? Básicamente, estoy cambiando fechas con estos observables, así que necesito saber para un objeto específico (this.data.Date) si el valor dado ha sido cambiado (si se completó el observer.next) o tal vez hay una función auxiliar como final/finalize para los observables.
Respuesta #1
Aunque es difícil entender a partir del código que compartiste cómo exactamente estás haciendo esto. Pero en lo que respecta a tu pregunta -
Así que necesito saber para un objeto específico (this.data.Date) si el valor dado ha sido cambiado
En el caso de los observables de rxjs, existe un operador distinctUntilChanged que sirve exactamente para el mismo propósito. Lee aquí.
Solo emitir cuando el valor actual sea diferente al anterior.
Una solución de ejemplo
getDates.pipe(distinctUntilChanged())
.subscribe(data => console.log("This will only hit if data changed"));
Ve si eso funciona para ti.
Respuesta #2
si cada vez devuelves un new Observable() donde te suscribas, obtendrás valores diferentes, por ejemplo, si devuelves un return new Observable(Math.random()*10) y te suscribes en 2 componentes, obtendrás valores diferentes, pero creo que necesitas obtener el mismo valor, así que para este escenario usa Subject()
Primero tienes que declararlo, luego asignar un valor y luego devolver this.subject.asObservable(), esto te da la oportunidad de suscribirte a este sujeto.
Ejemplo simple
// set initial value to subject, ussualy set data above constructor
dataSubject = new BehaviorSubject(null);
// then you get data from server
// response can be data from serve or data from eventEmitter whatever you need
this.dataSubject.next(response);
// then return this subject
return this.dataSubject.asObservable()
En este caso usa BehaviorSubject porque puede contener un valor y también puedes establecer el valor inicial del sujeto
Si tienes más preguntas, no dudes en preguntar.
