typescript - RxjS shareReplay: ¿cómo reiniciar su valor?
Uso shareReplay para llamar solo una vez (como una caché) a un servicio web para obtener algunas informaciones:
En mi servicio :
getProfile(): Observable<Customer> {
return this.callWS().pipe(shareReplay(1));
}
En múltiples componentes :
this.myService.getProfile().subscribe(customer => {
console.log('customer informations has been retrieved from WS :', customer);
});
Ahora quiero agregar un método para forzar la actualización de la información (omitir shareReplay solo una vez). Intenté guardando mi observable en una variable y asignándole null antes de reinicializarlo, pero parece que rompe las suscripciones de los componentes..
¿Alguna ayuda?
Gracias
Respuesta #1
Sé que este hilo es antiguo, pero creo que entiendo lo que la otra respuesta quiso decir sobre anteponer un asunto "reset" para enviar nuevos valores. Mira este ejemplo:
private _refreshProfile$ = new BehaviorSubject<void>(undefined);
public profile$: Observable<Customer> = _refreshProfile$
.pipe(
switchMapTo(this.callWS()),
shareReplay(1),
);
public refreshProfile() {
this._refreshProfile$.next();
}
En el fragmento anterior, todos los nuevos suscriptores de profile$ recibirán el último valor emitido (al llamar a callWS() una vez). Si deseas "actualizar" el Cliente que se está compartiendo, deberías llamar a "refreshProfile()". Esto emitiría un nuevo valor pasando por switchMapTo, reasignando el valor de reproducción y también notificando a cualquier suscriptor abierto de profile$.
Que tengas un buen día
Respuesta #2
Las otras respuestas están bien, pero en lugar de tener que reiniciar el observable shareReplayed real, un enfoque más simple podría ser simplemente almacenar en caché el resultado de esta manera:
protected profile$: Observable<Customer>;
getProfile$(): Observable<Customer> {
if (!this.profile$) {
this.profile$ = this.callWS().pipe(shareReplay(1));
}
return this.profile$;
}
resetProfile() {
this.profile$ = null;
}
ref: https://blog.angularindepth.com/fastest-way-to-cache-for-lazy-developers-angular-with-rxjs-444a198ed6a6
