У меня есть SessionService
, который управляет токеном JWT и хранит пользовательские данные.Когда мое приложение запущено, мне нужно получить пользовательские данные из бэкэнда через http.Это может быть плохой идеей, но поскольку для служб нет ngOnInit()
, я делаю это в конструкторе SessionService
:
@Injectable({
providedIn: 'root'
})
export class SessionService {
constructor(
private errHandler: ErrorHandlingService,
private backend: UsersService
) {
const initialToken = this.rawToken; // localStorage.getItem('jwt')
if (!initialToken || this.isTokenExpired(initialToken)) {
localStorage.removeItem('jwt');
return;
}
this.fetchUser();
}
private fetchUser() {
this.backend.getMe().subscribe(
user => this.user = user,
err => this.errHandler.handle(err)
);
}
/* ... */
}
Я думаю, что это довольно просто, UsersSevice::getMe()
- это просто абстракция для:
getMe() {
return this.http.get<Api.V1.Me.Get.Response>('/api/v1/me');
}
Проблема в том, что мой HttpInterceptor
, который присоединяет JWT к заголовку каждого http-запроса, который он получает через мой SessionService
, получает эту службу как undefined
, поэтому TypeError
возникает при обращении к его rawRoken
getter (can not read property rawToken of undefined
)
@Injectable()
export class JwtInterceptor implements HttpInterceptor {
constructor(private session: SessionService) {}
intercept(req: HttpRequest<unknown>, next: HttpHandler) {
const rawToken = this.session.rawToken;
/* ... */
}
}
Я нашел обходной путь, чтобы обернуть мой this.fetchUser()
вызов setTimeout(() => this.fetchUser(), 0)
, но почему я должен отложить это на другойповорот цикла событий?Это мой вопрос.Скажите, пожалуйста, какое правило я нарушаю?