2017-02-04 5 views
2

В моем устройстве Angular2 у меня есть компонент, который вызывает метод обслуживания. Метод службы возвращает Observable, и компонент подписывается на него.RxJS Ab (используя) map function Observables

Как я хочу, чтобы служба кэшировала последние вызовы, я бы перехватил данные в Observable с помощью функции map. Метод образцового обслуживания выглядит следующим образом

provideData():Observable<Data> { 
    return this.http.get(url). 
    map(resp => resp.json()). 
    map(data => { 
      this.cachedData = _.cloneDeep(data); 
      return data; 
    } 
} 

Этот подход работает для меня, однако, я не уверен, если я не злоупотребляю функцию map которая ничего не отображает. Это просто перехватчик для хранения данных. Есть ли лучшие или более рекомендуемые способы?

PS: Это не обязательно относится к кешированию, а не к соответствующему использованию функции map для операций без отображения. In this question Широко одобренный ответ Günter действительно делает то же самое и использует для этого map. С другой стороны, пользователь olsn заявил в комментариях, что do будет еще более уместным.

+1

Что о http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share -the-result-of-an-angular-2-http-network-call-in/36291681 # 36291681 –

+0

@ GünterZöchbauer Приятно видеть, что вы в основном делали то же самое с точки зрения использования функции карты для выполнения кэширования. Похоже, это и есть путь. – Matt

+1

Вместо использования 'map' используйте' do'-operator, так что вам не нужно добавлять return-statement – olsn

ответ

1

PublishReplay делает вашу многоадресную рассылку потоков и кэширует поток источника.

provideData():Observable<Data> { 
    return this.http.get(url) 
    .map(resp => resp.json()) 
    .publishReplay(); 
} 

Для экстенсивного объяснения, как это работает оператор посмотреть на Making a lazy, cached observable that only execute the source once

+0

Эй, Марк. Спасибо за Ваш ответ. Как обсуждалось в теме вопроса, я искал что-то вроде функции '' do''. Но, очевидно, особенно для целей кэширования, ваше предложение абсолютно справедливо. Я прочитаю об этом. – Matt