Gostaria de implementações de cache de uma grande quantidade de informações (não é possível salvar no localStorage), vi implementações com interceptors mas não funcionou, tenho um consulta via get na API, e quero um cache para não solicitar a API durante um intervalo de tempo. Já tentei também com shareReplay(), refCount().
@Injectable()
export class CachingInterceptorService implements HttpInterceptor {
public readonly store: Record<string, Observable<HttpEvent<any>>> = {};
constructor() {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// Don't cache if it's not cacheable
if ( req.method !== 'GET' ) {
return next.handle(req);
}
// Check if observable is in cache, otherwise call next.handle
const cachedObservable = this.store[req.urlWithParams] ||
( this.store[req.urlWithParams] = next.handle(req).pipe(
// Filter since we are interested in caching the response only, not progress events
filter((res) => res instanceof HttpResponse ),
// Share replay will cache the response
shareReplay(1),
));
// pipe first() to cause the observable to complete after it emits the response
// This mimics the behaviour of Observables returned by Angular's httpClient.get()
// And also makes toPromise work since toPromise will wait until the observable completes.
return cachedObservable.pipe(first());
}
}
Outra Referência: https://indepth.dev/posts/1248/fastest-way-to-cache-for-lazy-developers-angular-with-rxjs