RxJS Observables,在发出API请求之前检查缓存

时间:2017-06-04 17:44:07

标签: angular typescript rxjs observable

我正在创建一个Angular应用并拥有一个API服务。如果请求的数据不在缓存中,则我的get方法仅进行HTTP调用。我使用基于Promise的LocalForage库,并将它们转换为Observables。

export class CacheService {
  get(prop: string) {
    return Observable.fromPromise(localForage.getItem(prop));
  }

现在在我的API服务中,我正在竞争我的缓存和http observables,如下所示:

export class ApiService {
  get(uri: string) {
      return Observable.race(
        this.cache
          .get(uri)
          .filter(res => !!res),

        this.http.get(uri)
      );
  }
}

由于Observable.race仅返回首先发出 的observable,我认为只要我使用.filter()运算符,一切都会成功。但是,如果数据不在缓存中,它们都不会返回,因此永远不会发出HTTP请求。如果有人能够指出我的错误或建议更好的解决方案,那我就是全部。

1 个答案:

答案 0 :(得分:3)

只要其中一个观察结果完成,问题就是race完成。您的缓存调用不会发出null但会立即完成。您可以使用merge在完成后继续使用,take(1)仅考虑第一个结果:

export class ApiService {
  get(uri: string) {
      return Observable.merge(
        this.cache
          .get(uri)
          .filter(res => !!res),

        this.http.get(uri)
      ).take(1);
  }
}