angular 中取消 HTTP 请求和解决错误功能
Canceling HTTP request and resolving error function in angular
您好,我想在 2 秒后取消我的 http 请求。如果没有收到数据,它应该解析为错误函数和 return 一个空对象。
我知道我必须以某种方式使用超时 属性。我在哪里使用 $timeout 呢?我不太确定我是否理解正确。
app
.service('testService',['$http','$q','$timeout',
function($http,$q,$timeout){
var canceler=$q.defer();
this.options = function (long,lat) {
return $http({
method: 'POST',
url: '/coordinates',
headers: {
'Content-Type' : 'application/json; charset=utf-8',
'Data-Type': 'json'
},
data: {
"long":long,
"lat": lat
},
timeout:canceler.promise
}).then(function (response) {
return response.data;
},function(error){
return {};
});
};
}]);
在您的 $timeout 中使用 reject
作为
$timeout(function(){
return canceler.reject(reason);
},2000);
因此,您 $http
请求看起来像:
var timeoutCase = function(){
$timeout(function(){
return canceler.reject(reason);
},2000);
}
var apiCall = function(){
// call timeout function
timeoutCase();
// http call
return $http({
method: 'POST',
url: '/coordinates',
headers: {
'Content-Type' : 'application/json; charset=utf-8',
'Data-Type': 'json'
},
data: {
"long":long,
"lat": lat
},
timeout:canceler.promise
}).then(function (response) {
$timeout.cancel(timeoutCase);
return response.data;
},function(error){
return {};
});
}
// call Http function.
api().then(function(response){
console.log(response);
})
您可以将配置对象传递给您正在使用的方法(在您的场景 POST 中):
post(url, data, [config]);
在配置对象中您可以指定超时 属性:
timeout – {number|Promise} – timeout in milliseconds, or promise that should abort the request when resolved.
因此,您的 POST
方法调用示例如下:
$http.post('www.host.com/api/resource', {payload}, {timeout:2000})
.then(function(){ //success });
.catch(function(){ return {};});
return {};
就是模拟你说的空对象。
在 angular 文档站点上有一些使用 $http 服务的好例子
另一方面,$timeout
是 Angular 对 window.setTimeout
的包装,这里是 link 对 documentation 的包装。
因此您可以使用 $timeout 来触发 resolve 您的取消承诺,或者让超时 属性 在执行请求时完成它的工作。那将取决于您的要求。但我的建议是对您正在执行的请求使用超时 属性。不需要通过外部计时器取消请求。
您可以使用 $timeout 来实现这一点。您根据哪个先结束取消http请求或超时承诺。如果首先发生超时,则取消 http 请求,如果 http promise 在超时之前解决,则取消超时。这是一个例子:
var httpPromise = $http({
method: 'POST',
url: '/coordinates',
headers: {
'Content-Type' : 'application/json; charset=utf-8',
'Data-Type': 'json'
},
data: {
"long":long,
"lat": lat
}
});
var timeoutPromise = $timeout(function () {
httpPromise.reject("Timeout occurred"); // timeout occurred first, reject httpPromise.
}, 2000);
return httpPromise.then(function(data){
$timeout.cancel(timeoutPromise); //http request resolved before timeout occurred, cancel the timeout.
return data;
});
您好,我想在 2 秒后取消我的 http 请求。如果没有收到数据,它应该解析为错误函数和 return 一个空对象。
我知道我必须以某种方式使用超时 属性。我在哪里使用 $timeout 呢?我不太确定我是否理解正确。
app
.service('testService',['$http','$q','$timeout',
function($http,$q,$timeout){
var canceler=$q.defer();
this.options = function (long,lat) {
return $http({
method: 'POST',
url: '/coordinates',
headers: {
'Content-Type' : 'application/json; charset=utf-8',
'Data-Type': 'json'
},
data: {
"long":long,
"lat": lat
},
timeout:canceler.promise
}).then(function (response) {
return response.data;
},function(error){
return {};
});
};
}]);
在您的 $timeout 中使用 reject
作为
$timeout(function(){
return canceler.reject(reason);
},2000);
因此,您 $http
请求看起来像:
var timeoutCase = function(){
$timeout(function(){
return canceler.reject(reason);
},2000);
}
var apiCall = function(){
// call timeout function
timeoutCase();
// http call
return $http({
method: 'POST',
url: '/coordinates',
headers: {
'Content-Type' : 'application/json; charset=utf-8',
'Data-Type': 'json'
},
data: {
"long":long,
"lat": lat
},
timeout:canceler.promise
}).then(function (response) {
$timeout.cancel(timeoutCase);
return response.data;
},function(error){
return {};
});
}
// call Http function.
api().then(function(response){
console.log(response);
})
您可以将配置对象传递给您正在使用的方法(在您的场景 POST 中):
post(url, data, [config]);
在配置对象中您可以指定超时 属性:
timeout – {number|Promise} – timeout in milliseconds, or promise that should abort the request when resolved.
因此,您的 POST
方法调用示例如下:
$http.post('www.host.com/api/resource', {payload}, {timeout:2000})
.then(function(){ //success });
.catch(function(){ return {};});
return {};
就是模拟你说的空对象。
在 angular 文档站点上有一些使用 $http 服务的好例子
另一方面,$timeout
是 Angular 对 window.setTimeout
的包装,这里是 link 对 documentation 的包装。
因此您可以使用 $timeout 来触发 resolve 您的取消承诺,或者让超时 属性 在执行请求时完成它的工作。那将取决于您的要求。但我的建议是对您正在执行的请求使用超时 属性。不需要通过外部计时器取消请求。
您可以使用 $timeout 来实现这一点。您根据哪个先结束取消http请求或超时承诺。如果首先发生超时,则取消 http 请求,如果 http promise 在超时之前解决,则取消超时。这是一个例子:
var httpPromise = $http({
method: 'POST',
url: '/coordinates',
headers: {
'Content-Type' : 'application/json; charset=utf-8',
'Data-Type': 'json'
},
data: {
"long":long,
"lat": lat
}
});
var timeoutPromise = $timeout(function () {
httpPromise.reject("Timeout occurred"); // timeout occurred first, reject httpPromise.
}, 2000);
return httpPromise.then(function(data){
$timeout.cancel(timeoutPromise); //http request resolved before timeout occurred, cancel the timeout.
return data;
});