下面是一个非常原始的方式的例子,我正在处理一个花费太长时间的HTTP调用。
如果超过3秒钟,重新开火,如果失败4次则退出。
虽然它有效,但我不希望创建这样的每个HTTP请求,因为一个调用的代码太多了。
有没有办法全球应用?
我不确定拦截器是否适用于这种情况,因为我需要在HTTP调用花费太长时间后启动错误句柄,而不是从服务器收到错误响应时。
我还需要将其应用于部分视图请求。
代码:
var errorCount = 0;
function someFunction() {
var startTime = new Date().getTime();
var deferred = $q.defer();
var url = 'some url';
$http.get(url, {cache: true, timeout: 3000}).success(function(response) {
deferred.resolve(response);
}).error(function(result, status, header, config) {
var respTime = new Date().getTime() - startTime;
if( respTime >= config.timeout ){
errorCount +=1;
if ( errorCount > 3) {
errorCount = 0;
deferred.reject(result);
} else {
getCountries();
};
} else{
deferred.reject(error);
};
});
return deferred.promise;
};
答案 0 :(得分:0)
好的,这就是我最终做的事情。
可能不是最好的方式,但也许有人会发现它也很有用!
因此,使用拦截器我将所有传出的HTTP请求配置为在3秒后中止,并配置任何状态为' abort' (我认为这是' -1'的状态)重试3次。
代码:
(function() {
'use strict';
angular
.module('InterceptModule', []);
angular
.module('InterceptModule')
.factory('myInterceptor', myInterceptor);
myInterceptor.$inject = ['$q', '$injector','$cookies']
function myInterceptor($q,$injector,$cookies) {
var errorCount = 0;
var service = {
responseError: responseError,
request : request
};
return service;
//////////
/* this function is where tell the request to re-fire if it
* has been aborted.
*
*/
function responseError(response) {
if ( response.status == -1 ) {
var deferred = $q.defer();
var firstResponse = response;
var url = response.config.url;
var $http = $injector.get('$http');
$http.get(url, {cache: true}).then(function(response) {
deferred.resolve(response);
}, function(result, status, header, config) {
if ( status == -1 ) {
errorCount += 1;
if ( errorCount > 3 ) {
errorCount = 0;
deferred.reject(result);
} else {
responseError(firstResponse);
}
};
deferred.reject(result);
});
return deferred.promise;
};/* if */
return $q.reject(response);
};
/**
* this function is where we configure our outgoing http requests
* to abort if they take longer than 3 seconds.
*
*/
function request(config) {
config.timeout = 3000;
return config;
};
}/* service */
})();
注入我们的拦截模块
angular
.module('myApp', ['InterceptModule']);
然后在我们的配置中推送我们的拦截器
$httpProvider.interceptors.push('myInterceptor');