angular - 如何在 Angular 5 中执行缓存 http get 请求?
问题描述
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable()
export class ApiService {
constructor(private http: HttpClient) { }
// get API request
public apiGetRequest(url: any): Observable<any> {
return this.http.get(url)
.pipe(
catchError(this.handleError('apiGetRequest'))
);
}
}
我正在使用带有 rxjs 版本 5.5.6 的 angular 5 我正在尝试缓存多个 http 获取请求。
解决方案
您可以创建内部键/值对存储解决方案来缓存请求。在这里,我为此使用Map()。
import { Injectable } from '@angular/core';
import { HttpEvent, HttpRequest, HttpHandler, HttpInterceptor, HttpResponse } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { tap, shareReplay } from 'rxjs/operators';
@Injectable()
export class CacheInterceptor implements HttpInterceptor {
private cache = new Map<string, any>();
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (request.method !== 'GET') {
return next.handle(request);
}
const cachedResponse = this.cache.get(request.url);
if (cachedResponse) {
return of(cachedResponse);
}
return next.handle(request).pipe(
tap(event => {
if (event instanceof HttpResponse) {
this.cache.set(request.url, event);
}
})
);
}
}
现在您需要处理缓存失效。每当数据更改时,您都需要使其无效。
推荐阅读
- android - 如何在不使用 C 的情况下使用 aarch64 打印数字
- arrays - 使用扁平化!在数组数组上不起作用
- ruby-on-rails - 如何通过 webpacker 将 jstree 添加到 Rails
- java - DataBindig 向布局返回错误的 onFocusChangeListener
- facebook - 我们应该向我们的网站添加 Open Graph 元属性吗?
- xamarin - 打开自定义过滤 UI 时 RadDataGrid 的高度发生变化
- android - 发布 APK 版本未更新
- javascript - Wheelnav:有没有办法重置或调用物品的悬停效果?
- django - 字段 'id' 需要一个数字,但得到了
- php - 如何在 PHP 中使用 dimensionFilter 和 matchType 创建报告?(GA4)