Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular RxJS可观察到,在发出API请求之前检查缓存_Angular_Typescript_Rxjs_Observable - Fatal编程技术网

Angular RxJS可观察到,在发出API请求之前检查缓存

Angular RxJS可观察到,在发出API请求之前检查缓存,angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我正在创建一个Angular应用程序,并且有一个API服务。我的get方法仅在请求的数据不在缓存中时进行HTTP调用。我正在使用基于Promise的LocalFlow库,并将它们转换为可观察对象 export class CacheService { get(prop: string) { return Observable.fromPromise(localForage.getItem(prop)); } 现在,在我的API服务中,我正在对缓存和http观察值进行竞赛,如下所

我正在创建一个Angular应用程序,并且有一个API服务。我的
get
方法仅在请求的数据不在缓存中时进行HTTP调用。我正在使用基于Promise的LocalFlow库,并将它们转换为可观察对象

export class CacheService {
  get(prop: string) {
    return Observable.fromPromise(localForage.getItem(prop));
  }
现在,在我的API服务中,我正在对缓存和http观察值进行竞赛,如下所示:

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

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

由于
Observable.race
只返回最先发出的可观测值,我认为只要我使用
.filter()
操作符,一切都会成功。但是,如果数据不在缓存中,它们都不会返回,因此永远不会发出HTTP请求。如果有人能指出我的错误或提出更好的解决方案,我洗耳恭听。

问题是,
race
一旦完成一个观测值就完成了。缓存调用不会发出null,但会立即完成。您可以使用<代码>合并<代码>完成后继续执行,<代码>(1)只考虑第一个结果:

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

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

你的订阅在哪里?@yakoffain谢谢你的回复。我确信我的订阅不是问题所在,因为如果我删除
.filter
,那么我会得到一个null响应,因为缓存还没有任何内容。@yazeedb Hmm。。。。可观察到的种族行为对我来说似乎很奇怪。当Federico Galassi在回答中提到的一个源完成(因为)时,它发送
complete
通知,但它猜测这不是预期的行为。