Как сплющить наблюдаемоеНаблюдаемым <any>? - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь получить 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>.

Iхотите проверить кеш на предмет объекта и, если он не существует, получить его с сервера, кешировать и вернуть.

Однако, если объект существует в кеше, он возвращает Observable<MyType>,но если ему нужно перейти на сервер, он возвращает Observable<Observable<MyType>>.

Как я могу сгладить результат с сервера, чтобы я мог возвращать Observable, вызывая только сервер, когда это необходимо?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете использовать 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();
0 голосов
/ 07 июня 2018

Вместо 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(...);
  })
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...