覆盖我的可观察变量会杀死当前订阅者吗?

Will overwriting my observable variable kill current subscribers?

我希望能够缓存一个 http 调用,同时强制刷新缓存。我的服务如下所示:

@Injectable()
export class UserService {
  private currentUser$: Observable<User>;

  constructor(private http: HttpClient) { }

  getCurrentUser(force = false): Observable<User> {
    if (!this.currentUser$ || force) {
      this.currentUser$ = this.http.get<User>(`${environment.API_URL}/profiles/me`)
        .pipe(
          shareReplay(CACHE_SIZE)
        );
    }
    return this.currentUser$;
  }
}

如果我调用 getCurrentUser(true)currentUser$ 变量将被覆盖。恐怕这会消灭所有现有订阅者。这是真的?我怎样才能保存它们?

this.currentUser$ 视为指向堆上的对象。 您的方法 returns 对 this.currentUser$ 的引用的副本。所以所有订阅的观察者将继续听他们的(直到他们都取消订阅并且 Observable 被垃圾收集)。

如果您使用 "force" 调用该方法,this.currentUser$ 将指向堆上其他地方的另一个 Observable<User>

我将 post 我在这里所做的,以防对其他人有所帮助。我 return 一个 BehaviorSubject 的单个实例,只要我需要 "force" 获取当前用户,就向它推送新值。我还添加了一个标志 fetchingCurrentUser,这样我就不会在等待对 API 的第一次调用完成时进行多次调用。

如果有人发现任何问题或对如何制作它有任何想法,请告诉我 cleaner。谢谢

@Injectable()
export class UserService {
  private currentUser$: BehaviorSubject<User>;
  private fetchingCurrentUser: boolean;

  constructor(private http: HttpClient) {
    this.currentUser$ = new BehaviorSubject(null);
  }

  getCurrentUser(force = false): Observable<User> {
    if (this.currentUser$.value == null || force) {
      this.refreshCurrentUser();
    }
    return this.currentUser$.asObservable();
  }

  refreshCurrentUser() {
    if (!this.fetchingCurrentUser) {
      this.fetchingCurrentUser = true;
      this.http.get<User>(`${environment.API_URL}/profiles/me`)
        .subscribe(x => {
          this.currentUser$.next(x);
          this.fetchingCurrentUser = false;
        });
    }
  }