在$http
错误处理程序中,我需要区分真正的HTTP错误和已取消的请求。
以下是一个例子:
app.controller('Ctrl', function ($http, $q) {
const vm = this;
this.errors = [];
vm.errorHandler = (label) => ((error) => {
this.errors.push(label + ' : \n\n' + JSON.stringify(error, null, 2));
});
vm.unResolved = () => {
$http({
method: 'GET',
url : 'https://Idonotexist'
}).catch(vm.errorHandler('unResolved'));
}
vm.cancelled = () => {
const canceller = $q.defer()
$http({
method: 'GET',
timeout: canceller.promise,
url : 'https://www.googleapis.com/books/v1/volumes?q=isbn:0747532699'
}).catch(vm.errorHandler('cancelled'));
canceller.resolve();
}
vm.unsecured = () => {
$http({
method: 'GET',
url : 'http://Idonotexist'
}).catch(vm.errorHandler('unsecured'))
}
});
在我的errorHandler
功能中,我想区分已取消的请求和真正的错误(例如“不安全”或“未解析的主机”)。
将取消者传递给错误处理程序将是一件非常痛苦的事情,如果没有angularjs取消器,它将无法正确处理浏览器取消的请求。
到目前为止,这是我在错误处理程序中遇到的错误。
未取消(主机未解决)请求出错:
{
"data": null,
"status": -1,
"config": {
"method": "GET",
"transformRequest": [
null
],
"transformResponse": [
null
],
"jsonpCallbackParam": "callback",
"url": "https://Idonotexist",
"headers": {
"Accept": "application/json, text/plain, */*"
}
},
"statusText": ""
}
取消请求时出错:
{
"data": null,
"status": -1,
"config": {
"method": "GET",
"transformRequest": [
null
],
"transformResponse": [
null
],
"jsonpCallbackParam": "callback",
"timeout": {
"$$state": {
"status": 1,
"processScheduled": false,
"pur": true
}
},
"url": "https://www.googleapis.com/books/v1/volumes?q=isbn:0747532699",
"headers": {
"Accept": "application/json, text/plain, */*"
}
},
"statusText": ""
}
我有一个包含promise的config.timeout但我想避免使用它。我想将浏览器取消的请求请求视为没有取消者。
以下是jsfiddle示例。
有没有办法在取消的请求上添加一个拦截器然后专门标记?
更新
这无法解决angularjs $ http代码没有分隔错误而不是超时或中止。你可以看到它here。
正在运行pull request。