如何使用Angular检索HTTP状态代码;s$q承诺
How can I retrieve HTTP status codes using Angular's $q promises?
我的代码中有一个$http.post
到后端,当然事情可能会出错。如果我在angular中使用以下语法:
$http.post(url).success(function(data, status, headers, config))
.error(function(data, status, headers, config));
如果出现错误,我可以使用status
检索错误代码,并在error()
中定义的函数中处理它。然而,如果我采取这种方法(这就是我实际使用的方法):
var deferred = $q.defer();
$http.post(url).success(deferred.resolve).error(deferred.reject);
return deferred.promise;
使用第二种语法,我将所有ajax调用都放在一个单独的ServiceJS
目录中,并且可以根据具体情况处理成功或错误。例如,如果第二个片段是Service.MyFunction()
,那么在我需要它的代码中,我会:
Service.MyFunction().then(function() {},
function(data, status, headers, config) {});
但是,如果我使用这个代码块,status
、headers
、config
都是未定义的。我的问题是如何在保留此语法的同时仍然检索错误代码?
作为一个添加的引用,后端是一个C#Web API项目,它将使用return BadRequest();
等返回错误。
试试这样的东西:
myFunction(){
var deferred = $q.defer();
// you can use .then() instead of .success or .error
$http.post(url).then(function(successResponse){
var data = successResponse.data;
var status = successResponse.status;
...
deferred.resolve(successResponse);
}, function(failureResponse){
var status = failureResponse.status;
var config = failureResponse.config;
...
deferred.reject(failureResponse);
});
return deferred.promise;
}
好吧,我认为实现http拦截器并从那里处理http错误是一种很好的做法,也是一种更标准的做法,除了在每个http或资源对象上逐个处理错误之外,您的代码将位于一个位置。
基本上,您可以根据您得到的错误状态来划分要采取的操作,例如:
angular.module('app').factory('myInterceptor', ['$q',
function($q){
return {
'responseError': function(rejection){
switch(rejection.status){
case 0:
//'No connection, is the internet down?'
break;
case 422:
// error
break;
case 484:
// error
break;
default:
// message rejection.status, rejection.statusText
break;
}
return $q.reject(rejection);
}
};
}
]);
$http
已经返回了一个promise,为什么不使用它呢?
function myFunction() {
return $http.post(url);
}
// ...
myFunction().success(function(data, status, headers, config) {
// ...
});
... or ...
myFunction().then(...);
从$http
返回的promise除了具有其他promise方法之外,还具有方法success
和error
。阅读更多关于$http的Angular文档。
相关文章:
- 干净的代码和嵌套的承诺
- 组织承诺代码
- 用Javascript承诺包装同步代码有什么好处吗
- Javascript承诺:它们能在用户空间代码中完全实现吗
- 使我的异步代码与setTimeout同步.我需要承诺吗
- 当承诺链编码错误时,代码会起作用
- 此代码中嵌套承诺的目的是什么
- 使用 co 和来自同步代码的承诺(mongoDB 示例)
- 解析云代码:如何调用异步保存的承诺
- Javascript Jquery在外部样式表更改/重新加载承诺方式后执行代码
- 使用承诺编写可读代码的最佳方法是什么?
- 清理带有承诺的意大利面条代码
- 如何使用Angular检索HTTP状态代码;s$q承诺
- 如何理解这个承诺代码
- 解析云代码-承诺问题
- 解析云代码-承诺
- 使用Jquery解决所有承诺后执行代码
- 这个承诺函数的代码出了什么问题
- 将异步代码转换为承诺代码
- 将承诺代码从Q转换为蓝鸟