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

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

拦截器的内部工作原理肯定与我假设的不同,并且处理创建的可观察对象的方式与人们预期的不同。