AngularJS捕获$http操作的所有状态代码
AngularJS catch all status-codes for $http actions?
我的$http
函数可以返回以下错误:
岗位http://foobar.dev/foobar500(内部服务器错误)
岗位http://foobar.dev/foobar401(未经授权)
难道没有一种方法可以捕捉所有的状态代码吗?
$http.post('/foobar', form)
.success(function(data, status, headers, config) {
console.info(data);
})
.error(function(data, status, headers, config) {
console.error(data);
if(status === 401) {
$scope.setTemplate('show-login');
}
if(status === 500) {
$scope.setTemplate('server-error');
}
}
);
其中,$scope.setTemplate()
是控制器内部设置视图的函数。
但我必须为每个error()
函数做这件事,有很多类似的函数也不能使其成为DRY代码:p
我想要的是捕捉错误,并根据错误中返回的状态代码执行操作。
仅供参考:我没有使用Angulars $routeProvider()
。
您可以使用Angular $http
拦截器来实现这一点,就像@Dalorzo解释的那样:
var myApp = angular.module("myApp", [], ['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push(['$rootScope', '$q', function($rootScope, $q) {
return {
'responseError': function(response) {
var status = response.status;
// Skip for response with code 422 (as asked in the comment)
if (status != 422) {
var routes = {'401': 'show-login', '500': 'server-error'};
$rootScope.$broadcast("ajaxError", {template: routes[status]});
}
return $q.reject(response);
}
};
}]);
});
然后在您的控制器中接收:
$scope.$on("ajaxError", function(e, data) {
$scope.setTemplate(data.template);
});
现在,您不必输入每个error
函数。
不如这样做:
var routes = {'401':'show-login', '500': 'server-error'};
$scope.setTemplate(routes[status]);
其中routes
是包含错误代码和所需路由的字典。
这正是$http
拦截器的用途。请参阅此处的拦截器部分:$http
基本上,您为所有$http
请求创建了通用功能,可以在其中处理不同的状态。例如:
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2){
return {
response: function(response){
// do something for particular error codes
if(response.status === 500){
// do what you want here
}
return response;
}
};
});
// add the interceptor to the stack
$httpProvider.interceptors.push('myHttpInterceptor');
我最初要说的是为$http
服务创建一个装饰器,或者创建一个服务作为$http
服务的包装器。
相关文章:
- AngularJS$http重定向状态代码
- AJAX错误状态代码500内部服务器错误
- 如何将JavaScript自动POST的状态代码获取到另一个域
- Http状态代码工厂AngularJs
- 成功ajax:如果是200状态代码,则运行函数else另一个函数
- 运行函数ifsuccess($.ajax)有200个状态代码
- XMLHttpRequest 对象状态代码为 0
- URL中包含特殊字符的HTTP状态代码
- 如何使用scalajs-angular获取请求的http状态代码
- Internet Explorer:可以't访问IFrame内容,除非状态代码为200
- 如何侦听跨域映像请求上的任何301/302重定向状态代码
- 如果 angularjs 中的状态代码为 403,请注销
- 如何让反应路由器响应 404 状态代码
- HTTP 状态代码 - Backbone.js 和 Jquery
- 如何使用 iframe.src 下载文件时获取返回状态代码
- 预检响应具有无效的 HTTP 状态代码 405 - AngularJS + Spring MVC
- 使用 ajaxError 全局处理程序显示 HTTP 状态代码 401 详细信息
- http 状态代码 NodeJS/ExpressJS 错误
- 执行服务呼叫时的状态代码 12004
- AngularJS:使用 ngResource 执行 GET 请求时的状态代码 0