我正在尝试利用Angular 4.3+ HTTP_INTERCEPTOR来创建缓存。
如果调用的结果已经被缓存,它应该将缓存的结果推送到observable上,然后继续http调用。
这样,用户可以在缓存时立即查看他的数据,这样他就可以在服务器仍在检索(可能未更改的)数据时查看它。
但是,我不知道如何返回一个带有初始值的observable,该值将被.subscribe正确处理。
例如:
someApi.get$(1).subscribe((result: any) => {
console.log("Got result " + result);
});
...
// inside the interceptor
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// whole bunch of logic
let cachedResult = somethingRetrievedFromMyCache;
// How do I "return" cachedResult?
// Things I've tried:
// .startWith(cachedResult)
// Observable.of(cachedResult).concat(next.handle(request))
return next.handle(request);
}
预期方案:
Got result [cachedResult]
Got result [newResult]
由于
答案 0 :(得分:0)
似乎拦截器不是相互连接的可观察点。在意识形态上这是有道理的,因为拦截器更倾向于转换请求。
我发现如果我更高级别的话,concat()按预期工作。 以我的初始帖子为例:
someApi.get$(1).subscribe((result: any) => {
console.log("Got result " + result);
});
// inside someApi
get$(id: int): Observable<T>{
... // caching logic
let cachedResult = somethingRetrievedFromMyCache;
if(cachedResult){
return Observable.of(cachedResult).concat(this.httpClient.get<T>(url));
}
return this.httpClient.get<T>(url);
}
这很有效,订阅者会收到两次通知。
拦截器的内部工作方式必须与我假设的不同,并且处理可观察的创建方式与预期不同。