Как правильно передавать один общий объект?

Есть сервис user.service.ts, в котором есть метод:

loadUserData(): Observable<any> {
    const url = this.host + '/v1/user';
    return this.http.get(url, httpOptions);
  }


В компонентах где требуется получить текущего пользователя приходится делать:
userService.loadUserData().subscribe(
      data => {
        this.currentUser = new User(data);
      }
    );


Хочу избавится от постоянного запроса пользователя через апи. Есть два варианта:
1) Закинуть пользователя в локалстораж и уже оттуда получать через тот user.service.ts - мне не нравится этот вариант, т.к. хотелось бы не при логине получать пользователя, а каждый раз при заходе на сайт.
2) Получать пользователя при входе на сайт и класть в статическую переменную, а при запросе отдавать.
Но не выходит. Модифицировал сервис так:
constructor(protected http: HttpClient) {
    super(http);
    if (UserService.currentUser == null) {
      this.loadUserData().subscribe(
        data => {
          UserService.currentUser = new User(data);
        },
      );
    }
  }


Но когда компонент запрашивает в первый раз пользователя через this.user = UserService.currentUser; То получает null, т.к. в переменной еще ничего не содержится а конструктор с обращением к апи может выполняться неопределенно долго. Как правильно решить задачу? Какой бестпрактикс? Задача вроде распространенная. Использовать callback ?
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
@Alkimista
Тут хорошая статья на эту тему :)
Мы у себя на проекте активно использует подход с rxjs shareReplay.
https://blog.thoughtram.io/angular/2018/03/05/adva...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы