我想通过执行以下操作来获得Observable<MyType>
:
return this.cache.get<MyType, number>(storageName, version)
.map(cached => {
if (cached !== undefined) {
return cached;
}
return this.http.get<MyType>(`MyTypeGetUrl/${version}`)
.map(m => m)
.do(result => {
this.cache.put<MyType>(storageName, result).first().subscribe();
});
}).publishReplay(1).refCount();
cache.get
返回Observable<MyType>
,http.get<T>
返回Observable<T>
。
我想检查一个对象的缓存,如果它不存在,从服务器获取它,缓存它并返回它。
但是,如果对象存在于缓存中,则返回Observable<MyType>
,但如果需要转到服务器,则返回Observable<Observable<MyType>>
。
如何从服务器中展平结果,以便我可以返回一个Observable,只在必要时调用服务器?
答案 0 :(得分:2)
而不是map
使用mergeMap
并将缓存的结果包装到Observable中。在这两种情况下,它都会通过mergeMap
,因此它会将Observable<MyType>
展开到MyType
(您可以在此示例中使用concatMap
或switchMap
)
return this.cache.get<MyType, number>(storageName, version)
.mergeMap(cached => {
if (cached !== undefined) {
return Observable.of(cached);
}
return this.http.get(...);
})
...
答案 1 :(得分:2)
您可以像这样使用mergeMap和Observable.of:
return this.cache.get<MyType, number>(storageName, version)
.mergeMap(cached => {
if (cached !== undefined) {
return Observable.of(cached);
}
return this.http.get<MyType>(`MyTypeGetUrl/${version}`)
.map(m => m)
.do(result => {
this.cache.put<MyType>(storageName, result).first().subscribe();
});
}).publishReplay(1).refCount();