当前位置: 首页 > 知识库问答 >
问题:

如何在 Angular2 中缓存 XHR [重复]

贺景铄
2023-03-14

我搜索了如何在Angular2中缓存XHR,发现使用了< code>share()方法。但是我创建的服务并不像我预期的那样工作。

// api_service.interface.ts
interface Api {}
@Injectable()
export class ApiService {
  private caches: { [url: string]: Observable<Api> } = {};

  constructor(private http: Http) {}

  fetch(req: Request): Observable<Api> {
    return this.http.request(req).map((res) => res.json());
  }
  get(url: string): Observable<Api> {
    // Return cached data
    if (url in this.caches) return this.caches[url];

    let req = {
      method: RequestMethod.Get,
      url: url,
    }

    // Store observable object using share() method
    return this.caches[url] = this.fetch(new Request(req)).share();
  }
}

// demo.component.ts
@Component({ ... })
export class DemoComponent {
  public data;

  constructor(private api: ApiService) {
    this.api.get('/test.json').subscribe((data) => this.data = data);
  }
}

// boot.ts
import { ... } from ...
bootstrap(RouterComponent, [ApiService, ...]);

我错过了什么?(当然,导入所需的类和接口)

共有1个答案

巫培
2023-03-14

为此,您需要利用do运算符

getData() {
  if (this.cachedData) {
    return Observable.of(this.cachedData);
  } else {
    return this.http.get(...).map(...)
        .do(data => {
          this.cachedData = data;
        })
  }
}
 类似资料:
  • 问题内容: 我想知道是否有一种方法可以检测何时从本地缓存返回响应?可能吗? 解决方案应该是通用的,适用于无条件的请求。在这种情况下,响应代码始终为200 OK,但是XHR返回用于第二个请求的缓存资源(例如,第一个响应包含Expires标头,因此无需在到期日期之前向服务器请求新资源)。 问题答案: 答案是日期标题 如果日期标头在发送日期之前,则响应来自缓存。 如果日期报头在发送请求的日期之后,则响应

  • 我想知道是否有一种方法可以检测本地缓存何时返回响应?可能吗? 解决方案应该是通用的,并且适用于无条件的请求。在这种情况下,响应代码总是200 OK,但是XHR为第二个请求返回一个缓存的资源(例如,第一个响应包含Expires头,因此在到期日之前不需要向服务器请求新的资源)。

  • 我通过一个服务公开了一个HTTP GET请求,几个组件正在使用这个数据(一个用户的配置文件细节)。我希望第一个组件请求实际执行对服务器的HTTP GET请求并缓存结果,这样后续的请求将使用缓存的数据,而不是再次调用服务器。 这里有一个服务的例子,你会建议如何用Angular2和typescript实现这个缓存层。

  • 对于Angular 1.x,我找到了ng-bind-html的点击,但2.x似乎不支持这一点 thx Frank

  • 我想创建一个网站,即使当它的服务器离线时也可以工作——我发现这就是服务工人的目的。 当我重新加载带有service worker且没有连接的页面时,它工作正常。但是,轮班重新加载(例如,绕过缓存)会解除服务工作人员的防护,并出现“无法连接到服务器”错误。 我的问题是-我是否可以以某种方式防止轮班重新加载(shift f5、ctrl f5等)破坏服务人员,或者至少在不恢复连接的情况下使其恢复?

  • 问题内容: 从缓存还原后,我需要在磁盘上缓存resp并保持其类型为http.Response。有任何想法吗? 问题答案: 最简单的方法是使用httputil.DumpResponse和http.ReadResponse。 请参阅此处的示例。(您必须将代码复制到本地计算机上并在本地计算机上运行,​​因为Playground不允许I / O) 第一个将接收到的请求转储到内存中的[]字节中,然后可以将其