我有一个类,有很多方法可以在我的一个角度2应用程序中处理身份验证。其中一种方法用于处理angular / http模块抛出的错误。例如。如果响应为401,则处理程序方法将通过this.logout()在同一个类中调用logout方法。但是当我构建应用程序并在浏览器中测试它时,我得到了一个" this.logout()不是一个函数"一旦http请求以401响应。
public handle(error: Response | any, caught: Observable<any>): Observable<ResponseError> {
let errRes: ResponseError;
if (error instanceof Response) {
const body = error.json();
errRes = { message: body.message, statusCode: error.status };
if (body.hasOwnProperty('authCheck')) {
errRes.authCheck = body.authCheck;
}
if (_.inRange(errRes.statusCode, 401, 403)) {
this.logout()
}
} else {
const errMsg = error.message ? error.message : error.toString()
errRes = { message: errMsg }
}
return Observable.throw(errRes)
}
答案 0 :(得分:0)
免责声明:我不熟悉Typescript
在javascript中(我不确定打字稿,但我只能假设),this
关键字实际上并没有在你的回调中保留上下文。
您可以通过在服务中命名let _this = this;
之类的内容来解决此问题,以便在调用回调时保存this
上下文。 _this
将引用您的注销方法的上下文,即
let _this = this;
_this.logout = function() { ... };
然后将this.logout();
代码替换为:
if(_.inRange(errRes.statusCode, 401, 403)) {
_this.logout()
}
答案 1 :(得分:0)
我想我找到了解决方案。我实际上是将方法/函数传递给另一个func(句柄)上下文。当我将其更改为:
func((error, caught) => {
return handle(error, caught)
})
它工作正常。谢谢你的想法。