使用服务内部服务

时间:2016-11-04 11:47:35

标签: angular angular2-services

我试图向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未定义

我不知道怎么回事,因为我试图在服务中使用服务。我在以下提供商中添加了AuthService

providers: [ 
    ...,
    AuthService
]

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

1 个答案:

答案 0 :(得分:2)

这是因为this方法以及this引用的上下文。当您将函数指定为回调

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

或者,如果您使this成为箭头功能,则会保留errorHandler = (error: any): Observable<any> => { (指代服务实例)

def my_handler(event, context):
    try:
        s3conn.head_object(Bucket='my_bucket', Key='my_filename')
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "404":
            raise ClientException("Key '{}' not found".format(filename))
            # or: return "Key '{}' not found".format(filename) ?

class ClientException(Exception):
    pass