我需要一个一个发送多个get请求(必需)。当计数为 2-3 时,它工作正常,但是有将近 6 个 HTTP Get 请求,有时其中一些会失败并给出 Internal Sever Error(500)
。在新选项卡中打开错误链接会提供所需的结果。
所以服务器端没有问题。
我在 localhost
和 production
中都遇到了这个问题。
客户端如何处理这种情况?
我试过:
NodeJS + SocketIO
无需询问即可从服务器发送数据。 [如果套接字持续写入 60 秒,那么数据量会很大。套接字重新注册并从头开始。]Angular + NGResource
。 [内部使用http get。问题仍然存在。]Angular + Restangular 库
。 [内部使用http get。问题仍然存在。]
请建议我怎么知道问题出在哪里。那只有我能想出办法了。
谢谢!!
最佳答案
这是一个函数,您可以在其中包装 HTTP 调用。它会重复调用直到它通过。谨防!如果 HTTP 调用 100% 失败(例如,格式错误的 URL),那么该函数将不会停止(在测试中,该函数被调用 >70,000 次。显然没有 promise 的递归限制)。对于这种情况,我包含了一个在 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 注入(inject)你的 Controller /服务/等等。
关于javascript - 如何处理 "Random HTTP GET"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22929414/