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

时间:2014-02-07 17:23:29

标签: 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 + basePath + 'getAll/' + window.clientId, {});
        }
    };
});

然后,在其他地方,我正在使用该服务w /:

Things.getAll().success(function(things){
  //do something w/ things
})
.error(function(err){
  // Clearly, something went wrong w/ the request
});

我想做的是,例如,如果服务级别的数据存在问题,则能够“抛出”错误条件。即:

数据回复为:

{
  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()promise而不是成功promise。

有没有人对如何做到这一点有任何想法?

非常感谢!

1 个答案:

答案 0 :(得分:4)

如果您确定所有请求都遵循从响应中返回的数据包含状态代码的约定,则使用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");

<强>参考文献: