Я создаю приложение Angular 9. У меня есть общая служба, которую я использую для обмена пользовательскими данными между моими компонентами. Он работает правильно, пока я не перезагружу приложение.
Моя sharedService называется UserService. Сервис устанавливает значение BehaviorSubject. При входе в систему он вызывает метод setLoggedInUser () для получения идентификатора пользователя из JWT, который хранится в другом BehaviorSubject в AuthenticationService. Затем данные пользователя запрашиваются через HTTP-вызов. Установлено значение loggedInUser:
export class UserService {
public loggedInUser: BehaviorSubject<User> = new BehaviorSubject<User>(null);
constructor(private http: HttpClient, private authenticationService: AuthenticationService) {
this.setLoggedInUser();
}
async setLoggedInUser() {
const userID: string = await this.authenticationService.userID.pipe(take(1)).toPromise();
const user: User = await this.getUserByID(userID).pipe(take(1)).toPromise();
this.loggedInUser.next(user);
}
getUserByID(id: string): Observable<User> {
return this.http.get<User>(`${this.baseUrl}/${id}`);
}
}
В моем компоненте я вызываю пользовательские данные при инициализации:
ngOnInit() {
this.userService.loggedInUser.pipe(take(1)).subscribe(user => {
console.log(user);
});
}
При перезагрузке конструктор UserService вызывает метод setLoggedInUser () для получения пользователя. UserID и пользовательские данные получены правильно, но метод ngOnInit из компонента вызывается до того, как this.loggedInUser.next (user) вызывается из setLoggedInUser < / em>. Вот почему я получаю null в своем компоненте.
Я также попытался вызвать setLoggedInUser () из моего app.component вместо вызова его из конструктора UserService:
export class AppComponent implements OnInit {
constructor(private userService: UserService) { }
async ngOnInit() {
await this.userService.setLoggedInUser();
const user = await this.UserService.loggedInUser.toPromise();
console.log(user);
}
}
Но это также показывает мне null. Это все та же проблема, что и раньше.
Другой метод, который я пробовал без эффекта, - передать BehaviourSubject как Observable, как указано здесь: Значение субъекта поведения пусто при попытке получить из второго компонента