gpt4 book ai didi

angularjs - 使用 $http 拦截器重试失败的请求

转载 作者:行者123 更新时间:2023-12-03 23:28:05 26 4
gpt4 key购买 nike

我的 webapp 正在与之交谈的 API 有时会过载,如果它无法处理请求,则会发送 500 Internal Server Error。

我的 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);
}
};
});

从服务器收到 500 响应码后如何重新发送请求?

最佳答案

Angular 提供对 $http 服务用于在响应中执行请求的配置对象的引用(response.config)。这意味着如果我们可以在拦截器中注入(inject) $http 服务,我们就可以轻松地重新发送请求。由于循环依赖,无法在拦截器中简单地注入(inject) $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);
}
};
});

Note: In this example implementation the interceptor will retry the request until you receive a response with status that is different than 500. Improvement to this can be adding some timeout before retrying and retrying only once.

关于angularjs - 使用 $http 拦截器重试失败的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32588822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com