Angular 拦截器 - "return" 执行 rxjs Observable 之前的值
Angular Interceptors - "return" value before executing rxjs Observable
我正在尝试利用 Angular 4.3+ HTTP_INTERCEPTORs 创建缓存。
如果调用的结果已经被缓存,它应该将缓存的结果推送到 observable 上,然后继续 http 调用。
这样,如果数据被缓存,用户可以立即看到他的数据,这样他就可以在服务器仍在检索(可能未更改的)数据时查看它。
但是,我不知道如何 return 一个具有初始值的可观察对象,它将被 .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]
谢谢
看来拦截器不是 concat() Observables 彼此的地方。从意识形态上讲这是有道理的,因为拦截器更多的是为了转换请求。
我发现如果我这样做,concat() 会按预期工作 higher-level。
以我的初始 post:
为例
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);
}
这有效,订阅者会收到两次通知。
拦截器的内部工作原理肯定与我假设的不同,并且处理创建的可观察对象的方式与人们预期的不同。
我正在尝试利用 Angular 4.3+ HTTP_INTERCEPTORs 创建缓存。
如果调用的结果已经被缓存,它应该将缓存的结果推送到 observable 上,然后继续 http 调用。
这样,如果数据被缓存,用户可以立即看到他的数据,这样他就可以在服务器仍在检索(可能未更改的)数据时查看它。
但是,我不知道如何 return 一个具有初始值的可观察对象,它将被 .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]
谢谢
看来拦截器不是 concat() Observables 彼此的地方。从意识形态上讲这是有道理的,因为拦截器更多的是为了转换请求。
我发现如果我这样做,concat() 会按预期工作 higher-level。 以我的初始 post:
为例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);
}
这有效,订阅者会收到两次通知。
拦截器的内部工作原理肯定与我假设的不同,并且处理创建的可观察对象的方式与人们预期的不同。