我需要逐个发送多个get请求(必需)。当计数为2-3时,它工作正常,但是有近6个HTTP Get请求,有时其中一些失败并给出Internal Sever Error(500)
。在新选项卡中打开错误链接可提供所需的结果。
所以服务器端没有任何问题。
我在localhost
和production
都遇到了这个问题。
如何从客户端处理这种情况?
我试过了:
NodeJS + SocketIO
无需询问即可从服务器发送数据。 [如果套接字一直写到60秒,那么有太多的数据。套接字重新注册&从头开始重启。] Angular + NGResource
。 [内部使用http get。问题仍然存在。] Angular + Restangular Lib
。 [内部使用http get。问题仍然存在。] 请建议我如何知道问题所在。然后我才能想到解决方案。
日Thnx !!
答案 0 :(得分:1)
这是一个可以包装HTTP调用的函数。它会重复通话直到通过。谨防!如果HTTP调用在100%的时间内失败(例如,格式错误的URL),那么该函数将不会停止(在测试中,该函数被称为> 70,000次。显然,promises没有递归限制)。对于这种情况,我已经包含了在n次尝试后停止的函数的限制版本。
var persistentRequest = function(requestFn) {
var deferred = $q.defer();
requestFn().then(function() {
deferred.resolve();
}, function() {
persistentRequest(requestFn).then(
function() {
deferred.resolve();
}
);
});
return deferred.promise;
}
var persistentRequestLimited = function(requestFn, n) {
var deferred = $q.defer();
if (n <= 0) {
deferred.reject('Did not complete in given number of tries');
} else {
requestFn().then(function(data) {
deferred.resolve(data);
}, function() {
persistentRequestLimited(requestFn, n-1).then(
function(data) {
deferred.resolve(data);
},
function(rejection) {
deferred.reject(rejection);
}
);
});
}
return deferred.promise;
}
例如,使用它:
persistentRequest(function() {
return $http.get('/myurl');
});
persistentRequestLimited(function() {
return $http.get('/myurl');
}, 10);
不要忘记将$ q注入您的控制器/服务/等。