首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将缓存的HttpResponse转换为可在HttpClient中观察的

将缓存的HttpResponse转换为可在HttpClient中观察的
EN

Stack Overflow用户
提问于 2017-10-20 04:26:36
回答 1查看 614关注 0票数 1

我使用拦截器来缓存和返回缓存的数据,作为角4.3 HttpClient特性的一部分。下面是从拦截器调用的实用程序服务,用于存储和返回HTTP响应。

代码语言:javascript
运行
复制
@Injectable()
export class LocalStorageCacheService implements HttpCache {
    get(req: HttpRequest<any>): HttpResponse<any> {
        return <HttpResponse<any>>JSON.parse(localStorage.getItem(btoa(req.url)))
    };
    put(req: HttpRequest<any>, resp: HttpResponse<any>): void {
        localStorage.setItem(btoa(req.url), JSON.stringify(resp));
    }
}

下面是我的拦截器,它检查缓存的条目,如果可用的话返回。

代码语言:javascript
运行
复制
@Injectable()
export class CacheInterceptorService implements HttpInterceptor {
    constructor(private localStorageCacheService: LocalStorageCacheService) {
    }
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      if (req.method !== 'GET') {
          return next.handle(req);
        }
        const cachedResponse = this.localStorageCacheService.get(req);
        if (cachedResponse) {
         **return Observable.of(cachedResponse);**
        }
        return next.handle(req).do(event => {
          if (event instanceof HttpResponse) {
            this.localStorageCacheService.put(req, event);
          }
        });
      }
}

我遇到的问题是,http调用没有击中调用组件的订阅部分。即语句返回Observable.of(cachedResponse);似乎没有正确返回。

有什么想法吗?

更新#1

我发现了问题,它显然是从对象到HttpResponse类型的转换由于某些原因而没有发生,所以为了证明这一点,当我使用普通对象手动构造对象时,它开始工作了。但很明显,手工铸造是一件肮脏的事情,需要弄清楚为什么铸造不起作用。

代码语言:javascript
运行
复制
if (cachedResponse) {

  let httpResponse = new HttpResponse({
    status : cachedResponse.status,
    body : cachedResponse.body,
    headers : cachedResponse.headers,
    statusText : cachedResponse.statusText,
    url : cachedResponse.url
  });

  return Observable.of(httpResponse)
};
EN

回答 1

Stack Overflow用户

发布于 2017-10-20 04:55:52

就像这样:

代码语言:javascript
运行
复制
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return <HttpRequest<any>>req.catch((error) => {
        return <HttpHandler>next.catch((err) => {
            if (req.method !== 'GET') {
                return next.handle(req);
            }
            const cachedResponse = this.localStorageCacheService.get(req);
            if (cachedResponse) {
                return Observable.throw(cachedResponse);
            }
            return next.handle(req).do(event => {
                if (event instanceof HttpResponse) {
                    this.localStorageCacheService.put(req, event);
                }
            });
        })
    })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46842368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档