如何展平Observable <observable <any>&gt;到Observable <any>?

时间:2018-06-07 11:31:31

标签: rxjs observable rxjs5

我想通过执行以下操作来获得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,只在必要时调用服务器?

2 个答案:

答案 0 :(得分:2)

而不是map使用mergeMap并将缓存的结果包装到Observable中。在这两种情况下,它都会通过mergeMap,因此它会将Observable<MyType>展开到MyType(您可以在此示例中使用concatMapswitchMap

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();