【问题标题】:How to cache get requests for a specific time?如何缓存特定时间的获取请求?
【发布时间】:2020-10-16 20:02:36
【问题描述】:

如何使用 Angular HttpInterceptor 缓存一段时间内的获取请求?我想在缓存到达服务器之前得到响应。

例如:

  1. 第一个请求从服务器获取数据

  2. 将响应缓存 60 秒

  3. 第二个请求从缓存中获取数据

  4. 如果第三个请求在 60 秒后从服务器缓存中获取数据

    @Injectable()
    export class JwtInterceptor implements HttpInterceptor {
      userDetails: any;
      constructor(public router: Router) { }
    
      intercept(
        request: HttpRequest<any>,
        next: HttpHandler
      ): Observable<HttpEvent<any>> {
    
        if (!request.url.includes('auth/login') && this.userDetails) {
          // TODO: If no internet connectivity logout from the session
          // For multi tenancy tenant ID is in auth token so no need to pass extra param just pass auth token
          request = request.clone({
            setHeaders: {
              'x-access-token': CommonUtils.getCookie('token')
            }
          });
        }
    
        return next.handle(request).pipe(
          map((event: HttpEvent<any>) => {
            return event;
          }),
          catchError((error: HttpErrorResponse) => {
            let data = {};
            data = {
              reason: error ? error : '',
              status: error.status
            };
            return throwError(error);
          })
        );
      }
    }
    

【问题讨论】:

  • 分享你的尝试会很有帮助
  • 我刚刚创建了一个 HttpInterceptor 来为每个请求附加 x-access-token 标头,所以我想知道有没有可能使用 HttpInterceptor 缓存请求的方法
  • 请分享拦截器的代码
  • 更新问题,请查收

标签: angular typescript angular-http-interceptors


【解决方案1】:

在这种情况下,您可以使用 publishReplay 来缓存来自 http 调用的数据,您可以提供第二个参数 windowtime,以毫秒为单位,缓存将超过此时间无效

  httpCall.pipe(
    publishReplay(1, 60000), // cache will be invalid after 60 seconds
    refCount()
  )
 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多