AngularJS http 中的错误处理然后构造
Posted
技术标签:
【中文标题】AngularJS http 中的错误处理然后构造【英文标题】:Error handling in AngularJS http get then construct 【发布时间】:2013-06-09 10:19:12 【问题描述】:如何处理 HTTP 错误,例如500,当使用 AngularJS 的“http get then”构造(promises)时?
$http.get(url).then(
function(response)
console.log('get',response)
)
问题是,对于任何非 200 的 HTTP 响应,内部函数都不会被调用。
【问题讨论】:
【参考方案1】:你需要添加一个额外的参数:
$http.get(url).then(
function(response)
console.log('get',response)
,
function(data)
// Handle error here
)
【讨论】:
请注意,上面的“响应”对象有:数据、状态、标题、配置、状态文本。上面的“数据”对象有:数据、状态、配置、状态文本。 (关于是否传递 statusText 有特殊规则 - 浏览器、移动设备与否、Web 服务器等) 另请注意:data.config.url
包含完整的 url + params ,以防您在 url 旁边传递参数
我不知道,但这不适用于我的情况。始终执行响应代码。【参考方案2】:
您可以使用以下方法使这更清洁:
$http.get(url)
.then(function (response)
console.log('get',response)
)
.catch(function (data)
// Handle error here
);
类似于@this.lau_ 的回答,不同的方法。
【讨论】:
我完全赞成这个解决方案。 它必须被接受,因为.error()
方法不适用于 500 错误!请接受。
v1.6.0中删除success
& remove
后的最佳解决方案
注意如果.then
有内部错误(例如调用不存在的方法),.catch
也会执行,而.then(success, error)
将仅在请求本身失败时处理错误
【参考方案3】:
https://docs.angularjs.org/api/ng/service/$http
$http.get(url).success(successCallback).error(errorCallback);
将 successCallback 和 errorCallback 替换为您的函数。
编辑:Laurent 的回答更正确,因为他使用的是then
。然而,我将把它留在这里,作为将访问这个问题的人们的替代方案。
【讨论】:
值得一提的是,这与 Laurent 的回答不同。.then()
返回一个承诺。 .success()
和 .error()
不这样做。
@james-brewer:更准确地说,.then()
返回一个 new 承诺。 .success()
和 .error()
没有,它们都返回 get(url)
提供的原始承诺。
请记住,$http api 的 success
和 error
回调将被弃用。
另外success
和error
也在v1.6.0中被删除,不能再使用了。
另请注意,文档说“已弃用”,但 success() 和 error() 实际上已完全“删除”;不要被愚弄了。【参考方案4】:
如果您想全局处理服务器错误,您可能需要为 $httpProvider 注册一个拦截器服务:
$httpProvider.interceptors.push(function ($q)
return
'responseError': function (rejection)
// do something on error
if (canRecover(rejection))
return responseOrNewPromise
return $q.reject(rejection);
;
);
文档:http://docs.angularjs.org/api/ng.$http
【讨论】:
我认为你在这里犯了一个错误。要处理响应错误,您需要创建一个响应拦截器,而不是像您所做的那样创建请求拦截器。 从 1.1.x 开始,Angular 的拦截器既是请求也是响应。【参考方案5】:试试这个
function sendRequest(method, url, payload, done)
var datatype = (method === "JSONP")? "jsonp" : "json";
$http(
method: method,
url: url,
dataType: datatype,
data: payload || ,
cache: true,
timeout: 1000 * 60 * 10
).then(
function(res)
done(null, res.data); // server response
,
function(res)
responseHandler(res, done);
);
function responseHandler(res, done)
switch(res.status)
default: done(res.status + ": " + res.statusText);
【讨论】:
【参考方案6】:我无法真正使用上述内容。所以这可能会对某人有所帮助。
$http.get(url)
.then(
function(response)
console.log('get',response)
).catch(
function(response)
console.log('return code: ' + response.status);
)
另请参阅$http response
parameter。
【讨论】:
以上是关于AngularJS http 中的错误处理然后构造的主要内容,如果未能解决你的问题,请参考以下文章
Angularjs 如何对 $http 调用进行正确的错误处理?
AngularJS 中利用 Interceptors 来统一处理 HTTP 的错误(reproduce)
AngularJS中的$http缓存以及处理多个$http请求
angularJS中的$http.get错误——成功不是函数[重复]