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

时间:2018-09-26 21:19:30

标签: angular rxjs observable rxjs6

我希望能够缓存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$变量将被覆盖。恐怕这会消灭所有现有的订户。这是真的?我该如何保存它们?

2 个答案:

答案 0 :(得分:0)

考虑this.currentUser$指向堆上的对象。 您的方法返回对this.currentUser$的引用的副本。因此,所有订阅的观察者将继续侦听(直到他们全部取消订阅,并且Observable获得垃圾收集)。

如果使用“ force”调用该方法,则this.currentUser$只会指向堆上其他位置的另一个Observable<User>

答案 1 :(得分:0)

我将在此处发布我所做的事情,以防它对其他人有帮助。我只返回BehaviorSubject的一个实例,并在需要“强制”获取当前用户时将新值推送到该实例。我还添加了一个标志fetchingCurrentUser,以便在等待对API的第一次调用完成时不会进行多次调用。

请让我知道是否有人对此有任何疑问或对如何使其更清洁 有任何想法。谢谢。

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