在angular$ http服务中,如何捕获错误的“状态”?

我正在读一本名为“Pro Angular JS”的书。 但是,我有一个关于如何捕捉错误状态的问题。

我编码是:

$http.get(dataUrl) .success(function (data){ $scope.data.products = data; }) .error(function (error){ $scope.data.error=error; console.log($scope.data.error.status); // Undefined! // (This is the spot that I don't get it.) }); 

如果我编码“console.log($ scope.data.error.status);” ,为什么console.log的参数是未定义的?

在书中,有一句话:“传递给错误函数的对象定义了状态和消息属性”。

所以我做了$ scope.data.error.status

为什么错了?

您的参数不正确,错误不会返回包含状态和消息的对象,而是按照下面描述的顺序将它们作为单独的parameter passing。

采取angular度文件 :

  • data – {string | Object} – 用转换函数转换的响应体。
  • 状态 – {number} – 响应的HTTP状态码。
  • 头文件 – {函数([headerName])} – 头文件getter函数。
  • config – {Object} – 用于生成请求的configuration对象。
  • statusText – {string} – 响应的HTTP状态文本。

所以你需要改变你的代码:

 $http.get(dataUrl) .success(function (data){ $scope.data.products = data; }) .error(function (error, status){ $scope.data.error = { message: error, status: status}; console.log($scope.data.error.status); }); 

显然,您不必创build表示错误的对象,您可以创build单独的作用域属性,但应用相同的原则。

$http传统promise方法的successerror已被弃用。 改为使用标准then方法。 看看文档https://docs.angularjs.org/api/ng/service/ $ http

现在正确的使用方法是:

 // Simple GET request example: $http({ method: 'GET', url: '/someUrl' }).then(function successCallback(response) { // this callback will be called asynchronously // when the response is available }, function errorCallback(response) { // called asynchronously if an error occurs // or server returns response with an error status. }); 

响应对象具有以下属性:

  • data – {string | Object} – 用转换函数转换的响应体。
  • 状态 – {number} – 响应的HTTP状态码。
  • 头文件 – {函数([headerName])} – 头文件getter函数。
  • config – {Object} – 用于生成请求的configuration对象。
  • statusText – {string} – 响应的HTTP状态文本。

200到299之间的响应状态代码被认为是成功状态,并且将导致成功callback被调用。

更新:作为angularjs 1.5,承诺方法的成功和错误已被弃用。 (看这个答案 )

从当前文档 :

 $http.get('/someUrl', config).then(successCallback, errorCallback); $http.post('/someUrl', data, config).then(successCallback, errorCallback); 

你可以使用函数的其他参数,如下所示:

 error(function(data, status, headers, config) { console.log(data); console.log(status); } 

请参阅$ http docs:

 // Simple GET request example : $http.get('/someUrl'). success(function(data, status, headers, config) { // this callback will be called asynchronously // when the response is available }). error(function(data, status, headers, config) { // called asynchronously if an error occurs // or server returns response with an error status. }); 

从官方angular度的文件

 // Simple GET request example : $http.get('/someUrl'). success(function(data, status, headers, config) { // this callback will be called asynchronously // when the response is available }). error(function(data, status, headers, config) { // called asynchronously if an error occurs // or server returns response with an error status. }); 

正如你所看到的错误callback的第一个参数是数据状态是次要的。

由于$http.get返回一个'promise',带有额外的方便方法successerror (它只是包装了结果),你应该可以使用(不pipe你的Angular版本如何):

 $http.get('/someUrl') .then(function success(response) { console.log('succeeded', response); // supposed to have: data, status, headers, config, statusText }, function error(response) { console.log('failed', response); // supposed to have: data, status, headers, config, statusText }) 

不是严格意义上的答案,但是如果你被“我的Angular的版本与文档不同”问题arguments ,即使你不知道合适的方法签名,也可以抛弃所有的arguments

 $http.get('/someUrl') .success(function(data, foo, bar) { console.log(arguments); // includes data, status, etc including unlisted ones if present }) .error(function(baz, foo, bar, idontknow) { console.log(arguments); // includes data, status, etc including unlisted ones if present }); 

然后,根据你发现的任何东西,你可以“修复”函数参数来匹配。

响应状态作为callback中的第二个参数( 来自文档 ):

 // Simple GET request example : $http.get('/someUrl'). success(function(data, status, headers, config) { // this callback will be called asynchronously // when the response is available }). error(function(data, status, headers, config) { // called asynchronously if an error occurs // or server returns response with an error status. });