Angularjs 在angular js中中止/取消/放弃http请求,然后重试
我正在开发一个应用程序,在该应用程序中,如果某个时间过去了,我必须停止侦听请求,就像如果在60秒内请求没有响应,那么我必须中止该请求,并且一次有多个请求。我不知道如何使用中止时间(60秒)跟踪每个请求。我的意思是我怎么知道哪个请求要中止 我想在我的AngularJS拦截器中实现这个功能。我尝试了很多博客和帖子,声称实现了这个功能,但没有任何帮助 这是我的截取代码Angularjs 在angular js中中止/取消/放弃http请求,然后重试,angularjs,http,xmlhttprequest,interceptor,abort,Angularjs,Http,Xmlhttprequest,Interceptor,Abort,我正在开发一个应用程序,在该应用程序中,如果某个时间过去了,我必须停止侦听请求,就像如果在60秒内请求没有响应,那么我必须中止该请求,并且一次有多个请求。我不知道如何使用中止时间(60秒)跟踪每个请求。我的意思是我怎么知道哪个请求要中止 我想在我的AngularJS拦截器中实现这个功能。我尝试了很多博客和帖子,声称实现了这个功能,但没有任何帮助 这是我的截取代码 $httpProvider.interceptors.push(['$cookies', '$rootScope', '$q'
$httpProvider.interceptors.push(['$cookies', '$rootScope', '$q', '$localStorage', '$sessionStorage','$timeout', function ($cookies, $rootScope, $q, $localStorage, $sessionStorage, $timeout) {
return {
'request': function (config) {
config.headers = config.headers || {};
if (typeof config.data !== 'object') {
config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
}
config.headers.Accept = 'application/json;odata=verbose';
config.headers['X-Requested-With'] = 'XMLHttpRequest';
var token = $localStorage.authToken || $sessionStorage.authToken;
if (token) {
config.headers.Authorization = 'Bearer ' + token;
}
return config;
},
'responseError': function (response) {
var status = response.status;
var error = '';
if(response.data.error) {
error = response.data.error;
}
if(status === 401) {
$rootScope.unauthorizedLogout();
} else if(status === 400 && (error === 'token_invalid' || error === 'token_not_provided')) {
$rootScope.unauthorizedLogout();
}
return $q.reject(response);
}
};
}]);
我确实尝试了$q.defer
,它是取消请求的解析方法,但它不能帮助我在应用程序中实现所需的功能
和平解决V您可以尝试使用 $httpProvider.defaults.timeout强>
angular.module('test', [])
.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.timeout = 60000;
}]);
将递增的超时值设置为请求
config.timeout = incrementalTimeout;
处理响应错误的拦截器应该如下所示
'responseError': function (response) {
var status = response.status;
var error = '';
//functionality to for request aborting and resending
if (status === -1 || status >= 500) {
if (attempts <= 3) {
attempts += 1;
return retryRequest(response.config);
}
} else {
// set incrementalTiemout and attempts to default value
incrementalTimeout = 4000;
attempts = 1;
}
if(response.data.error) {
error = response.data.error;
}
if(status === 401) {
$rootScope.unauthorizedLogout();
} else if(status === 400 && (error === 'token_invalid' || error === 'token_not_provided')) {
$rootScope.unauthorizedLogout();
}
return $q.reject(response);
}
这个答案对你有帮助吗?是的,我已经试过了。谢谢,但是我怎么会再次发送那个请求,而且它也不起作用。虽然我尝试设置
config.timeout=1000
,但效果不错。似乎angular正在忽略默认超时您可以在拦截器的“responseError”函数中重新发送超时请求$超时(函数(){/*重新发送请求*/},1000);好的,但是我们怎么知道要再次发送哪个请求,因为在给定的时间有多个请求正在发生。我想我必须试试这个。。。希望对我有用
// default request timeout is of 4 seconds and attempt is 1
var incrementalTimeout = 4000;
var attempts = 1;
function retryRequest (httpConfig) {
var thisTimeout = incrementalTimeout;
incrementalTimeout += 1000;
return $timeout(function() {
var $http = $injector.get('$http');
return $http(httpConfig);
}, thisTimeout);
}