Angularjs 1.4 拦截器不工作

Angularjs 1.4 interceptor not working

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

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

如果我在文件顶部放置一个警报,它会被调用,所以它正在加载文件。但是 none 其他警报,包括在文件底部和调用配置之前。 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') 替换了模块,所以模块在示例中是一个占位符,而不是某种方便的全局存储它......你需要明确定义你的模块, (或变量模块) (是的,我真的是 angular 的新手)

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

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);
            }
        };
    });

}]);

非常感谢您的帮助,我在示例中学到了关于 angular shorthand 的重要知识。 sbedulin 得到了答案,即使我需要评论的帮助才能得到 his/her 答案才能工作

通过 $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');

}]);

或者,您可以推送 docs

中定义的匿名函数
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 的用例 disabling button while ajax request