在Angular错误拦截器

时间:2017-02-06 12:21:36

标签: angularjs promise bootstrap-modal angular-promise

我正在使用承诺从我的网络应用程序查询服务。如果令牌无效,我现在想要使用模态向用户询问凭据,从后端查询新令牌,重新运行失败的请求并返回到我的初始请求的承诺的成功块中继续,因为没有发生任何事情

所以我设置了一个错误拦截器来捕获401,并打开一个模态请求凭据。然后我使用现有的AuthService来查询令牌并使用调整后的令牌返回$ http(response.config)。

这是我最初的要求:

MyService.getData().then(
    function(result) {
        console.log("process data");
    }
    , function(response) {
        console.log("error occurred retrieving data");
    }
);

这是我的错误拦截器,对401s作出反应:

Restangular.setErrorInterceptor(
        function(response) {
            if (response.status === 401) {
                console.log("interceptor catches");

                var modal = $uibModal.open({
                    templateUrl: "frame/view/Relogin.html",
                    controller: "ReloginController",
                });

                console.log("opened modal");

                return modal.result.then(function(data) {
                    console.log("get new token");
                    return AuthService.authenticate(data[0], data[1]).then(
                        function (token) {
                            console.log("set new token");                                
                        },
                        function(){
                            console.log("failed getting new token");
                        })
                        .then(function() {
                            console.log("now rerun request");
                            return $http(response.config);
                        });
                });
            }

            return $q.reject(response);
        });

现在发生的是,拦截器捕获401,并打开模态。但是现在不是等待用户输入并查询后端的新令牌,而是现在可以访问promise的错误块。

所以控制台输出是:

interceptor catches
opened modal
error occurred retrieving data

get new token
set new token
now rerun request

但我希望它是:

interceptor catches
opened modal
get new token
set new token
now rerun request
process data

我认为使用承诺是错误的......有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来我混淆了Restangular和Angular。只需按照示例here,我终于找到了问题。在> Angular<>中设置错误拦截器看起来像:

app.config(function($httpProvider){
    $httpProvider.interceptors.push(function($q, $injector) {
        return {
            responseError: function(response) {
                if (response.status === 401) {
                    console.log("interceptor catches");

                    var modal = $injector.get('$uibModal').open({
                        templateUrl: "frame/view/Relogin.html",
                        controller: "ReloginController",
                    });

                    return modal.result.then(function(data) {

                        return $injector.get('AuthService').authenticate(data[0], data[1]).then(
                            function (token) {
                                console.log("set new token");                                
                            },
                            function(){
                                console.log("failed getting new token");
                            })
                    .then(function() {
                        console.log("now rerun request");
                        return $injector.get('$http')(response.config);
                    });
            });
        }

        return $q.reject(response);
    });