在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方法的success
和error
已被弃用。 改为使用标准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',带有额外的方便方法success
和error
(它只是包装了结果),你应该可以使用(不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. });