在其构造函数中获取后端数据时,Angular服务未定义

时间:2018-11-21 19:38:05

标签: angular angular-services angular-httpclient angular-http-interceptors angular7

我有一个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,因此{{1} }在访问其TypeError吸气剂(rawRoken)时引发

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(),但是为什么必须将其推迟到另一轮事件循环中呢?那是我的问题。请告诉我,我违反了什么规则?

0 个答案:

没有答案