Estoy tratando de hacer un Observable RXJS que esencialmente actuará como un caché. Por lo general, solo puedo usar shareReplay para esto, sin embargo, los datos que intento almacenar en caché se basan en el usuario, por lo que es necesario restablecerlos. Lo siguiente hace casi lo que quiero:
const myObservable = userProfile.pipe( switchMap(profile => loadData(profile)), shareReplay(1) );Ahora los datos se cargan en la primera suscripción y no se volverán a cargar hasta que aparezca un nuevo perfil de usuario. Sin embargo, esto no funciona del todo, porque un suscriptor que se suscribe mientras se cargan los nuevos datos aún recibe los datos antiguos que se almacenan en caché. Esto hace que la interfaz de usuario muestre los datos antiguos del usuario anterior. Para eludir esto hice lo siguiente:
const myObservable = userProfile.pipe( switchMap(profile => loadData(profile).pipe(startWith(null))), shareReplay(1), filter(v => v != null) ); Esto ahora funciona muy bien excepto por una cosa: una vez que un nuevo usuario inicia sesión, los datos se cargan inmediatamente, aunque actualmente no hay suscriptores a myObservable . Esto sucede porque shareReplay nunca se da de baja de la fuente. Puede hacer que lo haga usando refCount: true , pero eso deshabilitará el comportamiento de almacenamiento en caché que quiero, porque el búfer de reproducción se borra cuando no hay más suscriptores.
No tengo idea de cómo lograr esto usando operadores RXJS o si necesito escribir un operador personalizado.