Javascript 触发AngularJS$http承诺的错误条件?

Javascript 触发AngularJS$http承诺的错误条件?,javascript,angularjs,promise,Javascript,Angularjs,Promise,因此,我有一个服务定义如下: angular.module('services', ['ngResource']) .factory('Things', function ($rootScope, $http) { var basePath = 'rest/things/'; return { getAll: function () { return $http.post($rootScope.PAGES_URL + basePat

因此,我有一个服务定义如下:

angular.module('services', ['ngResource'])
    .factory('Things', function ($rootScope, $http) {
    var basePath = 'rest/things/';
    return {
        getAll: function () {
            return $http.post($rootScope.PAGES_URL + basePath + 'getAll/' + window.clientId, {});
        }
    };
});
然后,在其他地方,我正在使用该服务w/:

Things.getAll().success(function(things){
  //do something w/ things
})
.error(function(err){
  // Clearly, something went wrong w/ the request
});
我想做的是,如果,例如,服务级别的数据出现问题,能够“抛出”错误条件。i、 e:

数据返回为:

{
  status:500,
  message:'There was a problem w/ the data for this client'
}
因此,在服务中会出现如下情况:

getAll: function () {
        return $http.post($rootScope.PAGES_URL + basePath + 'getAll/' + window.clientId, {})
  .throwError(function(data){
    return (data.status && data.status == 200);
  });
}
因此,当throwError回调返回false时,将调用error()承诺,而不是success承诺

有人对如何做到这一点有什么想法吗


非常感谢

如果您确定所有请求都将遵循从响应返回的数据包含状态代码的约定,那么使用HTTP侦听器是有意义的。为此,您可以创建一个服务并将其推送到
$httpProvider
的拦截器列表:

.factory("myHttpInterceptor", function ($q) {
    return {
        response: function (response) {
            if (response.data.status && (response.data.status === 500)) {
                return $q.reject(response);
            }
            return response || $q.when(response);
        }
    };
});
您可以将
==500
替换为
=400
这样的值来处理所有错误,而不仅仅是500

在模块的
.config()
中添加以下内容:

$httpProvider.interceptors.push("myHttpInterceptor");
参考文献:

  • $http
    拦截器:

如果您确定所有请求都将遵循从响应返回的数据包含状态代码的约定,那么使用HTTP侦听器是有意义的。为此,您可以创建一个服务并将其推送到
$httpProvider
的拦截器列表:

.factory("myHttpInterceptor", function ($q) {
    return {
        response: function (response) {
            if (response.data.status && (response.data.status === 500)) {
                return $q.reject(response);
            }
            return response || $q.when(response);
        }
    };
});
您可以将
==500
替换为
=400
这样的值来处理所有错误,而不仅仅是500

在模块的
.config()
中添加以下内容:

$httpProvider.interceptors.push("myHttpInterceptor");
参考文献:

  • $http
    拦截器:

在您的服务中创建延迟服务。实际上,钩住
$http
调用的成功和错误回调。在success中,检查响应的
状态
属性;如果它不在
200
范围内,则拒绝延迟的。否则,请解决延迟的问题。拒绝错误回调中的任何内容。并归还卫理公会服务部的延期承诺,谢谢。。你能给出一个代码示例作为答案吗?还有,我应该使用拦截器吗?如果您确信所有请求都将遵循此约定,那么使用拦截器肯定更有意义。您可以像该页面上的示例中那样创建拦截器,并在
响应
回调中,检查响应的属性
状态
,如果是“坏”,则使用
$q.reject(response)
,否则
返回响应| |$q.when(响应)确定。。。但在那一页上,它说要把拦截器的工厂连接起来。在我上面的例子中,我能把它链接到我的“服务”模块上吗?另外,你能把上面的评论添加到一个答案中,这样我就可以相信你了吗?:-)是的,你应该可以把它连到模块上!而且我不认为文档提供的两种方式之间有什么好处——我喜欢尽可能地将事情分解,所以我更愿意将其作为一种命名服务。我认为这样做,如果您愿意的话,也可以更容易地进行模拟/测试。在您的服务中创建延迟。实际上,钩住
$http
调用的成功和错误回调。在success中,检查响应的
状态
属性;如果它不在
200
范围内,则拒绝延迟的。否则,请解决延迟的问题。拒绝错误回调中的任何内容。并归还卫理公会服务部的延期承诺,谢谢。。你能给出一个代码示例作为答案吗?还有,我应该使用拦截器吗?如果您确信所有请求都将遵循此约定,那么使用拦截器肯定更有意义。您可以像该页面上的示例中那样创建拦截器,并在
响应
回调中,检查响应的属性
状态
,如果是“坏”,则使用
$q.reject(response)
,否则
返回响应| |$q.when(响应)确定。。。但在那一页上,它说要把拦截器的工厂连接起来。在我上面的例子中,我能把它链接到我的“服务”模块上吗?另外,你能把上面的评论添加到一个答案中,这样我就可以相信你了吗?:-)是的,你应该可以把它连到模块上!而且我不认为文档提供的两种方式之间有什么好处——我喜欢尽可能地将事情分解,所以我更愿意将其作为一种命名服务。我认为这样,如果你想模拟/测试的话,也会更容易。太棒了。谢谢你,伊恩!令人惊叹的。谢谢你,伊恩!