我正在创建一个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请求。如果有人能够指出我的错误或建议更好的解决方案,那我就是全部。
答案 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);
}
}