2016-12-07 1 views
1

Я хочу кэшировать (используя sessionStorage) ответ HTTP, который я получаю от rxjs. если один и тот же запрос (URL) вызывает еще раз, я хотел использовать sessionStorage вместо получения его обратно с сервера.Угловой 2 кэш http-ответ на sessionStorage

Im сохраняет URL как ключ для sessionStorage и ответ сервера как значение.

Im начинающий как для концепции Angular2, Rxjs, так и для Observer хотел знать, насколько масштабируемым этот подход.

private setLoginData():void{ 
    this.loginDataObserver().subscribe(
     (data:any)=>{ 
      let loginData:LoginUser={ 
       id : data.employee.id, 
       name : data.employee.first_name+' '+data.employee.last_name, 
       jobTitle : data.employee.job_title, 
       company : data.profile.name, 
       avatar : data.employee.avatar, 
       role : data.role 
      } 

     } 
    ); 
} 

private loginDataObserver(){ 
    let options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})}); 
    let params: URLSearchParams = new URLSearchParams(); 
    params.set('token',this.cookie.get('token')); 
    options.search=params; 

    if(sessionStorage.getItem(this.dataUrl+this.cookie.get('userId'))!=null){ 
     let cacheJson=JSON.parse(sessionStorage.getItem(this.dataUrl+this.cookie.get('userId'))); 
     let cacheDataProvider : BehaviorSubject<any> = new BehaviorSubject<any>(cacheJson); 
     let cacheObserver:Observable<any>=cacheDataProvider.asObservable(); 
     return cacheObserver; 
    } 

    return this.http.get(this.dataUrl,options). 
      do((res:Response) => sessionStorage.setItem(this.dataUrl,JSON.stringify(res.json()))). 
      map((res:Response) => res.json()). 
      catch(this.handleError) 
} 

Я планирую усилить это как сервис Anguler2 с методами для разрешения кэша,

ответ

1

Я хотел бы сделать три метода:

  • getUrlContentsFromCache(url) : Observable<string>
  • getUrlContentsFromWeb(url) : Observable<string>
  • storeInCache(url, contents) : Observable<string>

Поскольку Rx ленив по умолчанию можно использовать в сочетании с .concat.take(1) для предотвращения успешного извлечения из кэша также пойти и извлечения содержимого из Интернета:

function getContents(url){ 
    return getUrlContentsFromCache(url) 
    .concat(
     getUrlContentsFromWeb(url) 
     .flatMap(content => storeInCache(url, content)) 
    ) 
    .take(1); 
} 
+0

Я новичок в RxJx я буду смотреть эту идею вы отправили :) спасибо –

+1

Я бы рекомендовал прочитать здесь http://reactivex.io/rxjs/manual/overview.html, чтобы лучше понять концепции –