在angular服务中缓存rest请求

在angular服务中缓存rest请求,angular,Angular,我用的是角度6, 我有一个名为“UserService”的服务,它有一个名为“getUserInfo()”的方法,该方法从服务器获取用户的一些数据并保存它们。 有几个组件调用此方法,但我希望我的服务第一次发出HTTP请求,因为它没有用户信息,对于其他“getUserInfo()”调用,它应该提供已经从服务器获取的数据 实现这一点的最佳实践是什么?您只需将信息保存在服务的属性中,并在可用时提供它。看看下面的代码 import { Restangular } from 'ngx-restangula

我用的是角度6, 我有一个名为“UserService”的服务,它有一个名为“getUserInfo()”的方法,该方法从服务器获取用户的一些数据并保存它们。
有几个组件调用此方法,但我希望我的服务第一次发出HTTP请求,因为它没有用户信息,对于其他“getUserInfo()”调用,它应该提供已经从服务器获取的数据

实现这一点的最佳实践是什么?

您只需将信息保存在服务的属性中,并在可用时提供它。看看下面的代码

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;
        })
      );
  }
}

下次发布你到目前为止所做的事情。我们能为您做些什么?不管怎样,用防护装置来做。当组件执行http调用时,您还可以检查保存的对象中是否存储了用户信息。如果有,执行请求的函数将发出一个空的可观察值。如果没有,服务将进行调用,您将信息存储在此对象中。有一些方法可以做到这一点。例如,使用公共变量或行为子对象。如果你需要一个示例代码,请告诉我。
return new Observable(observer => {
  observer.next(this.userInfo);
  observer.complete();
  return { unsubscribe() {} };
});