Angular 如何确保HTTP请求只被调用一次?

Angular 如何确保HTTP请求只被调用一次?,angular,http,rxjs,Angular,Http,Rxjs,我有一个后端服务,可以返回我需要的多个角度组件的用户详细信息。我的问题是,它显然被多次调用。这是我的get请求: getUser(): Observable<User> { if (this.user) { return Observable.of(this.user); } else { return this.http .get<User>(BACKENDPATH) .map((user: User) => new

我有一个后端服务,可以返回我需要的多个角度组件的用户详细信息。我的问题是,它显然被多次调用。这是我的get请求:

getUser(): Observable<User> {
  if (this.user) {
    return Observable.of(this.user);
  } else {
    return this.http
      .get<User>(BACKENDPATH)
      .map((user: User) => new User().deserialise(user))
      .do((user) => {
        this.user = user;
        console.log(this.user.getUserName());
        return this.user;
      });
   }
}
getUser():可观察{
if(this.user){
(该用户)的可观察返回值;
}否则{
返回此文件。http
.get(后端路径)
.map((用户:用户)=>new user()。反序列化(用户))
.do((用户)=>{
this.user=用户;
console.log(this.user.getUserName());
返回此.user;
});
}
}
在函数的get部分之后,我尝试了以下方法,但没有一种有效:

  • .publishReplay(1).refCount()
  • .shareReplay()
  • .shareReplay(1)

这些方法在网上对其他人有效,所以我猜我在实现它们时出了问题,但我不知道是什么原因。

您正在通过每次
getUser()
调用创建一个新流。
解决方案:发出一个
Http
请求并处理缓存/存储的数据。使用下面的方法

export class SharedService {

    data$: Observable<User>;
    getUser(): void {

        this.data$ = this.http
            .get<User>(BACKENDPATH)
            .map((user: User) => new User().deserialise(user))
            .do((user) => {
                this.user = user;
                console.log(this.user.getUserName());
                return this.user;
            }).shareReplay(1);
    }

    getData(): Observable<User> {
        return this.data$;
    }
}

维卡斯帮助解决了这个问题。这是我现在的代码:

userData: Observable<User> = this.http
  .get<User>(BACKENDPATH)
  .map((user: User) => new User().deserialise(user))
  .shareReplay(1);

getUser(): Observable<User> {
  return this.userData;
}
userData:Observable=this.http
.get(后端路径)
.map((用户:用户)=>new user()。反序列化(用户))
.共享重播(1);
getUser():可观察{
返回this.userData;
}

我猜请求被发送了很多次,因为在点击
this.user=user之前行,许多组件都调用了方法
getUser()
。你能确认吗?@Picci是的,这就是为什么,但我相信我发布的方法的目的之一是,它不会多次发出get请求。你的问题在这里得到了回答:@ShaneWatson问题是如何使用
getUser()
。你叫过多次吗?或者,您只进行一次调用,然后多次调用
subscribe()
?如果您要多次调用您的方法,那么每次调用都会创建新的流,即触发多个请求,最好执行一个请求并使用缓存数据。您好@Vikas,我现在理解并通过注释更新了它。你怎么认为?
userData: Observable<User> = this.http
  .get<User>(BACKENDPATH)
  .map((user: User) => new User().deserialise(user))
  .shareReplay(1);

getUser(): Observable<User> {
  return this.userData;
}