在角度服务中缓存休息请求

时间:2018-07-16 11:22:01

标签: angular

我正在使用角度6 我有一个名为“ UserService”的服务,该服务具有一个名为“ getUserInfo()”的方法,该方法从服务器获取一些用户数据并将其保存。
有几个组件可以调用此方法,但是我希望我的服务在第一次没有用户信息的情况下发出HTTP请求,而对于其他“ getUserInfo()”调用,它应该提供能够已从服务器中获取。
实施此最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以简单地将信息保存在服务的属性中,并在可用时提供信息。看一下下面的代码。

import { Restangular } from 'ngx-restangular';
import { of } from 'rxjs';

export interface UserInfo {
  name: string;
  email: string;
}

@Injectable({
  providedIn: 'root' // for angular 6
})
export class UserService
  userInfo: UserInfo;
  constructor(private: rest: Restangular) {}
  getUserInfo(): Observable<UserInfo> {
    if (this.userInfo) {
      return of(this.userInfo);
    }
    return this.rest
      .one('/userInfo/')
      .get()
      .pipe(
        map<UserInfo, UserInfo>(data => {
          this.userInfo = data;
          return data;
        })
      );
  }
}

请注意:

  1. of是rxjs 5中Observable的一种方法,现在已成为函数(在rxjs 6中)。
  2. rest来自ngx-restangular
  3. 我返回of(this.userInfo)而不是this.userInfo的原因是,您将预订此方法,因此该方法必须返回一个Observable。
  4. of等同于下面的代码:

return new Observable(observer => {
  observer.next(this.userInfo);
  observer.complete();
  return { unsubscribe() {} };
});