Angular RxJS可观察到,在发出API请求之前检查缓存
我正在创建一个Angular应用程序,并且有一个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观察值进行竞赛,如下所
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
通知,但它猜测这不是预期的行为。