角度拦截器 - 在执行rxjs Observable之前“返回”值

时间:2018-02-27 13:08:05

标签: angular rxjs observable interceptor

我正在尝试利用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]

由于

1 个答案:

答案 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);
}

这很有效,订阅者会收到两次通知。

拦截器的内部工作方式必须与我假设的不同,并且处理可观察的创建方式与预期不同。