Как убедиться, что HTTP-запрос вызывается только один раз? - PullRequest
0 голосов
/ 06 июля 2018

У меня есть серверная служба, которая возвращает необходимые мне данные о нескольких компонентах Angular. Моя проблема в том, что он явно вызывался несколько раз. Вот мой запрос на получение:

getUser(): Observable<User> {
  if (this.user) {
    return Observable.of(this.user);
  } else {
    return this.http
      .get<User>(BACKENDPATH)
      .map((user: User) => new User().deserialise(user))
      .do((user) => {
        this.user = user;
        console.log(this.user.getUserName());
        return this.user;
      });
   }
}

Я пробовал следующие методы после получения части функции, но ни один из них не работал:

  • .publishReplay (1) .refCount ()
  • .shareReplay ()
  • .shareReplay (1)

Эти методы работали для других в Интернете, поэтому я предполагаю, что я что-то не так делаю с их реализацией, но не могу понять, что.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Викас помог разобраться с этой проблемой. Это мой код сейчас:

userData: Observable<User> = this.http
  .get<User>(BACKENDPATH)
  .map((user: User) => new User().deserialise(user))
  .shareReplay(1);

getUser(): Observable<User> {
  return this.userData;
}
0 голосов
/ 06 июля 2018

Вы создаете новый поток с каждым getUser() вызовом.
Решение: Сделайте один Http запрос и работайте с кэшированными / сохраненными данными. Используйте ниже подход

export class SharedService {

    data$: Observable<User>;
    getUser(): void {

        this.data$ = this.http
            .get<User>(BACKENDPATH)
            .map((user: User) => new User().deserialise(user))
            .do((user) => {
                this.user = user;
                console.log(this.user.getUserName());
                return this.user;
            }).shareReplay(1);
    }

    getData(): Observable<User> {
        return this.data$;
    }
}

Компонент:

this.service.getData().sub(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...