Dan*_*Dan 13 angularjs angular-http-interceptors
我的webapp正在谈论的API有时会超载,如果它无法处理请求,则发送500内部服务器错误.
我的Web应用程序可以发送100多个不同的请求,因此如果我单独执行重试,则会花费数小时的打字时间.
我已经在使用$ httpProvider拦截器,这里是(简化)
$httpProvider.interceptors.push(function ($q) {
return {
responseError: function (response) {
switch (response.status) {
case 401 :
window.location = "/";
alert('Session has expired. Redirecting to login page');
break;
case 500 :
// TODO: retry the request
break;
}
return $q.reject(response);
}
};
});
Run Code Online (Sandbox Code Playgroud)
从服务器获取500响应代码后,如何重新发送请求?
S.K*_*ski 18
Angular提供了对$ http服务用于在响应(response.config)中执行请求的配置对象的引用.这意味着如果我们可以在拦截器中注入$ http服务,我们可以轻松地重新发送请求.由于循环依赖性,在拦截器中简单地注入$ http服务是不可能的,但幸运的是有一种解决方法.
这是一个如何完成这种拦截器的实现的例子.
$httpProvider.interceptors.push(function ($q, $injector) {
var incrementalTimeout = 1000;
function retryRequest (httpConfig) {
var $timeout = $injector.get('$timeout');
var thisTimeout = incrementalTimeout;
incrementalTimeout *= 2;
return $timeout(function() {
var $http = $injector.get('$http');
return $http(httpConfig);
}, thisTimeout);
};
return {
responseError: function (response) {
if (response.status === 500) {
if (incrementalTimeout < 5000) {
return retryRequest(response.config);
}
else {
alert('The remote server seems to be busy at the moment. Please try again in 5 minutes');
}
}
else {
incrementalTimeout = 1000;
}
return $q.reject(response);
}
};
});
Run Code Online (Sandbox Code Playgroud)
注意:在此示例实现中,拦截器将重试请求,直到您收到状态不同于500的响应.对此的改进可能是在重试和重试一次之前添加一些超时.
归档时间: |
|
查看次数: |
8232 次 |
最近记录: |