2

首先让我说我是角度的菜鸟,所以我怀疑基于我缺乏理解的一个非常愚蠢的错误。

我正在尝试创建一个拦截器来处理请求和响应错误。

如果我在文件顶部放置一个警报,它就会被调用,所以它正在加载文件。但是没有其他警报,包括文件底部和调用配置之前的警报。responseError 和 requestError 永远不会被调用...

我已经尝试将其简化到重现问题的最低限度,我尝试了几个不同的示例来说明如何实现它,以防我使用过时的代码,我尝试注释掉控制器中的错误子句以防它吞下例外.....我大部分时间都在用谷歌搜索试图让它工作,我很难过。

$provide.factory('myHttpInterceptor', function ($q, dependency1, dependency2) {
    return {
        'responseError': function (rejection) {
            alert("Something went wrong");
            return $q.reject(rejection);
        },
        'requestError': function (rejection) {
        alert("Something went wrong");
        return $q.reject(rejection);
    }
    };
});
alert('myHttpInterceptor done');
module.config(['$httpProvider', function ($httpProvider) {
    alert('myHttpInterceptor push');
    $httpProvider.interceptors.push('myHttpInterceptor');
}]);

非常感谢任何帮助,尤其是对深入了解正在发生的事情的帮助

----为后人解答相关信息----

基于 sbedulins 和 Angad 答案的组合,我能够让它工作。

首先,一旦我得到它的工作,它可以在responeError和RequestError周围使用和不使用单引号......

dependency1 和 2 是未定义的,并且来自我在 SO 上得到的简化示例中的剪切和粘贴错误。所以我删除了它们。

然后我用 angular.module('defaultApp') 替换了模块,所以模块是示例中的占位符,而不是某种方便的全局存储它......你需要明确定义你的模块,(或变量模块)(是的,我真的是角度的新手)

因此,一旦将所有这些更改应用于 sbedulins 示例,我就在这里为这两种方法获得了工作代码,因为 postetity 这里是我的应用程序中的实际工作代码

angular.module('defaultApp').config(['$provide', '$httpProvider', function ($provide, $httpProvider) {

    $provide.factory('myHttpInterceptor', function ($q) {
        return {
            responseError: function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            },
            requestError: function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            }
        };
    });

    $httpProvider.interceptors.push('myHttpInterceptor');

}]);

或者

angular.module('defaultApp').config(['$httpProvider', function ($httpProvider) {

    $httpProvider.interceptors.push(function ( $q ) {
        return {
            'responseError': function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            },
            'requestError': function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            }
        };
    });

}]);

非常感谢您的所有帮助,我在示例中学到了有关角度速记的重要知识。sbedulin 得到了答案,即使我需要评论的帮助才能得到他/她的答案

4

1 回答 1

2

拦截器$provide应该在config阶段定义,就在将其推送到之前$httpProvider.interceptors

module.config(['$provide', '$httpProvider', function ($provide, $httpProvider) {

    $provide.factory('myHttpInterceptor', function ($q, dependency1, dependency2) {
        return {
            'responseError': function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            },
            'requestError': function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            }
        };
    });

    $httpProvider.interceptors.push('myHttpInterceptor');

}]);

或者,您可以推送文档中定义的匿名函数

module.config(['$httpProvider', function ($httpProvider) {

    $httpProvider.interceptors.push(function ($q, dependency1, dependency2){
        return {
            'responseError': function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            },
            'requestError': function (rejection) {
                alert("Something went wrong");
                return $q.reject(rejection);
            }
        };
    });

}]);

使用此处描述的工作 plunker 的用例在ajax 请求时禁用按钮

于 2015-11-19T22:34:27.533 回答