Угловой сервис не определен при извлечении данных бэкенда в его конструктор - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть 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), но почему я должен отложить это на другойповорот цикла событий?Это мой вопрос.Скажите, пожалуйста, какое правило я нарушаю?

...