2017-06-04 76 views
2

我正在创建一个Angular应用程序并拥有API服务。如果请求的数据不在缓存中,我的get方法只会进行HTTP调用。我正在使用基于Promise的LocalForage库,并将它们转换为Observables。RxJS Observables,在发出API请求之前检查缓存

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请求永远不会被创建。如果有人能指出我的错误或提出更好的解决方案,我全都听过。

+0

哪里是你的订阅? –

+0

@YakovFain谢谢你的回复。我确定我的订阅不是问题,因为如果我删除'.filter',那么我得到的响应为空,因为缓存还没有任何内容。 – yazeedb

+0

@yazeedb嗯.... Observable.race行为对我来说似乎很陌生。当其中一个源完成时(因为https://github.com/ReactiveX/rxjs/blob/master/src/OuterSubscriber.ts#L20-L22),Federico Galassi在回答中提到了它会发送'complete'通知,但是,它猜测这不是预期的行为。 – martin

回答

3

问题是race一旦完成其中一个可观测量就完成。您的缓存调用不会发出空值,而是立即完成。您可以使用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); 
    } 
}