3
respostas

Cache do Angular 10

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

3 respostas

Fala ai Matias, tudo bem? Eu precisaria entender mais do que se trata as informações e o porque do cache, isso porque tu também pode tentar utilizar uma store global como NGRX ou deletar o cache para a API.

Dando uma googlada aqui normalmente o pessoa recomenda a shareReplay para cache, exemplo: https://blog.thoughtram.io/angular/2018/03/05/advanced-caching-with-rxjs.html

Espero ter ajudado.

Fala, Matheus, eu comentei na pergunta que já utilizei essas opções que você passou. A consulta traz muitos dados, demora quase 1min em condições normais.

Fala Matias, eu sei que tu comentou sobre o shareReplay, mas, pode ser algum problema na maneira como tu tentou implementar e não o problema da função em si.

Também sugeri outras duas maneiras para tu pensar em como fazer o cache, que seria delegar isso para a API ou utilizar um gerenciamento de estado global na aplicação como NGRX, que não utiliza localStorage.

Para te dar uma resposta mais certeira eu teria que visualizar a funcionalidade, o problema e os requisitos, nesse caso precisaria dos projetos (front e back) para analisar com calma.

Espero ter ajudado.