У меня есть сервис UserService
, у которого есть метод getUsers()
, и этот сервис распределяется между различными угловыми компонентами.
Метод вызывает API и возвращает данные.Я хочу сохранить результат / состояние последнего вызова API, поэтому я использовал BehaviorSubject
для хранения последнего состояния, чтобы, если разные компоненты вызывают getUsers()
, был только один вызов API, в противном случае должно быть возвращено состояние удержания.
Вот как я это реализую
private _users$: BehaviorSubject<User[]>;
constructor(private http: HttpClient) {
this._users$ = new BehaviorSubject([]);
}
getUsers(): BehaviorSubject<User[]> {
if (!this._getUsersState().length) {
this._loadUsers();
this._users$.subscribe(() => {
return this._users$;
});
} else {
return this._users$;
}
}
_loadUsers() {
let _users$ = this.http.get(`${this._context}/users/`);
_users$.subscribe((users: User[]) => {
this._users$.next(Object.assign([], users));
});
}
_getUsersState(): User[] {
return this._users$.getValue();
}
И в компоненте
this.userService.getUsers().subscribe((users: any) => {
console.log(users);
});
но я получаю следующую ошибку
ERROR TypeError: Cannot read property 'subscribe' of undefined
Я думаю, получитьПользователи возвращаются автоматически, если длина равна 0.
Как я могу решить эту проблему?И хорош ли этот подход?