服务错误:这个。"方法"不是一个功能

时间:2017-03-22 17:42:50

标签: javascript angular typescript

我有一个类,有很多方法可以在我的一个角度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)
}

2 个答案:

答案 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)
})

它工作正常。谢谢你的想法。