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

Есть сервис 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 ?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 2
dmitry_luzanov
@dmitry_luzanov
Web frontend developer
class Service {
  private readonly currentUser = new ReplaySubject<User>()
  public readonly currentUser$ = this.currentUser.asObservable()

  constructor() {
    this.loadUserData()
  }

  private loadUserData(): void {
    this.http.get('api/v1/user').subscribe(userData => this.currentUser.next(new User(userData)))
  }
}


Потом в компоненте обращаться непосредственно к currentUser$.
Ответ написан
@Alkimista
Тут хорошая статья на эту тему :)
Мы у себя на проекте активно использует подход с rxjs shareReplay.
https://blog.thoughtram.io/angular/2018/03/05/adva...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
-.618 Москва
До 150 000 руб.
BeetSoft Омск
от 50 000 до 100 000 руб.
23 мая 2019, в 18:18
600 руб./в час
23 мая 2019, в 18:11
800 руб./в час
23 мая 2019, в 16:17
500 руб./в час