Будет ли перезапись моей наблюдаемой переменной уничтожать текущих подписчиков? - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу иметь возможность кэшировать 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 голосов
/ 27 сентября 2018

Я собираюсь опубликовать то, что я сделал здесь, на случай, если это поможет кому-то еще.Вместо этого я возвращаю один экземпляр 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;
        });
    }
  }
0 голосов
/ 27 сентября 2018

Думайте о this.currentUser$ как о том, что он указывает на объект в куче.Ваш метод возвращает копию ссылки на this.currentUser$.Таким образом, все подписанные наблюдатели будут продолжать их слушать (пока все они не откажутся от подписки, и Наблюдаемый не будет собирать мусор).

Если вы вызываете метод с помощью «force», this.currentUser$ просто укажет на другое Observable<User> где-нибудь еще в куче.

...