在服务中使用服务

Use service inside service

我正在尝试向 Http 添加一些功能,当用户收到 403 时,它会删除他的用户信息并重定向到登录。 AuthHttp 示例如下所示。

@Injectable()
export class AuthHttp {
    constructor(
        private http: Http,
        private router: Router,
        private authService: AuthService
    ) { }

    get(url: string, options?: RequestOptionsArgs): Observable<any> {
        return this.http.get(url, options)
            .catch(this.errorHandler);
    }

    errorHandler(error: any): Observable<any> {
        if (error.status === 403) {
            console.error('TOKEN EXPIRED!');
            this.authService.logout();

            let link = ['/login'];
            this.router.navigate(link);
        }

        return Observable.throw(error);
    }
}

问题是,我会收到以下错误:

EXCEPTION: this.authService is undefined

我不知道如何解决这个问题,因为我正在尝试在服务中使用服务。我在提供商内部添加了 AuthService,如下所示

providers: [ 
    ...,
    AuthService
]

路由器会抛出类似的错误。

是因为errorHandler方法,以及this所指的上下文。当您将函数指定为回调

时,您应该将函数绑定到 this
.catch(this.errorHandler.bind(this));

或者如果你把errorHandler做成箭头函数,this(指服务实例)会被维护

errorHandler = (error: any): Observable<any> => {