当取消像这样的HTTP请求:
$scope.runTest = function() {
if (canceler) canceler.resolve();
canceler = $q.defer();
$http({
method: 'GET',
url: 'http://www.google.com/',
timeout: canceler.promise
})
.success(function(data) {
$scope.result.push({msg: "this won't be displayed on cancel"});
})
.error(function(data) {
$scope.result.push({msg: "this will be displayed on cancel"});
});
};
是否有可能作出取消HTTP请求有一个特定的HTTP代码,例如205? 它会导致HTTP拦截与HTTP状态0,这也用于超时或没有网络连接触发。 我希望能够在拦截这两个方案之间进行区分
谢谢!
我结束了以下方法:
$scope.runTest = function() {
if (canceler) {
// Set non-zero status for http interceptors
// Using 499, an nginx extension to flag cancelled http requests
// Could be something else like a boolean, using status code for convenience
canceler.promise.status = 499;
// Cancel the request
canceler.resolve();
}
canceler = $q.defer();
$http({
method: 'GET',
url: 'http://www.google.com/',
timeout: canceler.promise
})
.success(function(data) {
// On sucesss
})
.error(function(data) {
// On error
});
};
在这里我只设置超时东西标志的要求是取消了,因为@Daniel席尔瓦建议。 然后在我的HTTP拦截器:
app.config(function($httpProvider) {
$httpProvider.interceptors.push(function($q) {
return {
'responseError': function(response) {
var statusCode = response.status;
// Get status from timeout, if 0 and timeout present
if (statusCode === 0 && response.config.timeout) {
statusCode = response.config.timeout.status;
}
// Ignore client request cancelled
if (statusCode === 499) {
return response;
}
// Reject via $q, otherwise the error will pass as success
return $q.reject(response);
}
};
});
});
你需要记住的是,角$ HTTP超时是一个“客户端”超时,尽管它有服务器超时同名。 当您配置的角度$ HTTP超时,你在说什么“我不会等到服务器超时”。 访问第三方API时,这可能是特别有用的,因为你不能配置超时设置。
这是HTTP状态0的原因没有HTTP 408响应,因为角取消请求,而不是等待服务器超时。
您可以使用$超时服务返回的承诺处理客户端超时
var myTimeout = $timeout(function () {
console.log("Cannot wait you anymore!");
}, 1000);
$http({
method: 'GET',
url: 'http://www.google.com/',
timeout: myTimeout
})
.success(function (data) {
$scope.result.push({ msg: "this won't be displayed on cancel" });
})
.error(function (data) {
$scope.result.push({ msg: "this will be displayed on cancel" });
});