У меня есть серверная служба, которая возвращает данные пользователя, которые мне нужны для нескольких компонентов 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.info(this.user.getUserName());
return this.user;
});
}
}
Я пробовал следующие методы после получения части функции, но ни один из них не работал:
Эти методы сработали для других в Интернете, поэтому я предполагаю, что я делаю что-то не так с их реализацией, но я не могу понять, что именно.
@Picci Да, именно поэтому, но я считаю, что одна из целей опубликованных мной методов состоит в том, чтобы они не отправляли запрос на получение несколько раз
Ответ на ваш вопрос находится здесь: stackoverflow.com/questions/51044291/…
@ShaneWatson Вопрос в том, как вы используете getUser(). Вы звоните несколько раз? Или вы делаете один звонок, а затем звоните subscribe() несколько раз?





Вы создаете новый поток с каждым вызовом 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.info(this.user.getUserName());
return this.user;
}).shareReplay(1);
}
getData(): Observable<User> {
return this.data$;
}
}
Составная часть:
this.service.getData().sub(...)
Викас помог разобраться в этой проблеме. Теперь это мой код:
userData: Observable<User> = this.http
.get<User>(BACKENDPATH)
.map((user: User) => new User().deserialise(user))
.shareReplay(1);
getUser(): Observable<User> {
return this.userData;
}
Если вы собираетесь вызывать свой метод несколько раз, вы в конечном итоге создаете новый поток с каждым вызовом, т.е. будет запускаться несколько запросов. Лучше сделать один запрос и работать с кэшированными данными.
Привет, @Vikas, теперь я понимаю и обновил комментарии, это работает. Как вы думаете?
Я предполагаю, что запрос отправляется много раз, потому что, прежде чем попасть в строку
this.user = user;, многие компоненты вызвали методgetUser(). Можешь подтвердить?