Angular 角度,rxjs:HTTP可观察,取决于经过身份验证的用户

Angular 角度,rxjs:HTTP可观察,取决于经过身份验证的用户,angular,rxjs,observable,Angular,Rxjs,Observable,我有一个HTTP端点,我想在应用程序组件中获取它 export class ExampleService { public summary$: Observable<any>; constructor(private http: HttpClient) { this.summary$ = this.http.get<any>('/api/summary'); } } 导出类示例服务{ 公开摘要$:可见; 构造函数(专用http:

我有一个HTTP端点,我想在应用程序组件中获取它

export class ExampleService {
    public summary$: Observable<any>;

    constructor(private http: HttpClient) {
        this.summary$ = this.http.get<any>('/api/summary');
    }
}
导出类示例服务{
公开摘要$:可见;
构造函数(专用http:HttpClient){
this.summary$=this.http.get('/api/summary');
}
}
但该查询的结果取决于当前经过身份验证的用户。 因此,我使用用户$对HTTP进行管道传输:

export class ExampleService {
  public summary$: Observable<any>;

  constructor(private http: HttpClient, private auth: AuthService) {
    this.summary$ = this.auth.user$.pipe(
      switchMap(user => {
        console.log('New user');
        if (!user) {
          return of(null);
        }
        return this.http.get<any>('/api/summary');
      })
    );
  }
}
导出类示例服务{
公开摘要$:可见;
构造函数(私有http:HttpClient,私有auth:AuthService){
this.summary$=this.auth.user$.pipe(
开关映射(用户=>{
console.log(“新用户”);
如果(!用户){
返回(空);
}
返回这个.http.get('/api/summary');
})
);
}
}
其中
此.auth.user$
是当前用户的ReplaySubject(1)

问题是:当summary$的订阅者下降到零并再次上升(在导航过程中)时,HTTP请求在控制台中用“新用户”再次调用

根据用户的不同,缓存HTTP请求的真正方法是什么


此外,还需要“在第一个订户之前不要发送请求”

谢谢您的评论。通过
shareReplay
解决

export class ExampleService {
  public summary$: Observable<any>;

  constructor(private http: HttpClient, private auth: AuthService) {
    this.summary$ = this.auth.user$.pipe(
      switchMap(user => {
        if (!user) {
          return of(null);
        }
        return this.http.get<any>('/api/summary');
      }),
      shareReplay(1)
    );
  }
}
导出类示例服务{
公开摘要$:可见;
构造函数(私有http:HttpClient,私有auth:AuthService){
this.summary$=this.auth.user$.pipe(
开关映射(用户=>{
如果(!用户){
返回(空);
}
返回这个.http.get('/api/summary');
}),
共享重播(1)
);
}
}

ReplaySubject(1)
保留其内部内容,无论有多少订户。并将该值提供给每个新订阅者,强制HTTP请求而不是replaySubject。您应该使用shareReplay操作符来尝试,这将缓存第一次HTTP调用后的结果