HTTP-ответ кэша Angular 2 на хранилище сеансов

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

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

Я новичок в концепции Angular 2, 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)
}

Я планирую улучшить это как службу Angular 2 с помощью методов включения кеша,


person Francis Manoj Fernnado    schedule 07.12.2016    source источник


Ответы (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);
}
person Mark van Straten    schedule 07.12.2016
comment
Я новичок в RxJx, я посмотрю идею, которую вы опубликовали :) спасибо - person Francis Manoj Fernnado; 07.12.2016
comment
Я бы рекомендовал почитать здесь reactivex.io/rxjs/manual/overview.html чтобы лучше разобраться в понятиях - person Mark van Straten; 07.12.2016