首先我要说的是,我是 Angular 方面的菜鸟,所以我怀疑由于我缺乏理解而犯了一个非常愚蠢的错误。
我正在尝试创建一个拦截器来处理请求和响应错误。
如果我在文件顶部放置一个警报,它就会被调用,因此文件就会被加载。但没有其他警报(包括文件底部和配置之前的警报)被调用。 responseError 和 requestError 永远不会被调用...
我尝试将其简化到重现问题的最低限度,我尝试了几个不同的示例来了解如何实现它,以防我使用过时的代码,我尝试注释掉 Controller 中的错误子句,以防万一它正在吞噬异常......我一天中的大部分时间都在谷歌上搜索,试图让它发挥作用,但我被难住了。
$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') 替换了 module,因此 module 是示例中的占位符,而不是某种方便的全局存储它...您需要显式定义您的模块(或变量模块) (是的,我确实对 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 速记的重要知识。 sbedulin 得到了答案,尽管我需要评论的帮助才能得到他/她的工作答案
最佳答案
通过$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);
}
};
});
}]);
这里描述了工作插件的用例 disabling button while ajax request
关于javascript - Angularjs 1.4 拦截器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814989/