当我遇到一个严重的问题时,我正在尝试使用jquery AJAX调用:当网络特别堵塞时,一些调用在没有触发error()回调的情况下丢失,它们只是永远保持活动状态。我可以设置超时并在那之后再试一次,但这会大大降低程序的响应能力。
我发现这个问题的一个更好的解决方案是进行幂等服务器调用并创建一个小插件,它会多次复制ajax调用,直到我得到第一个响应,然后它中止所有其他尝试。
然而,即使这段代码确实提高了我的通话的可靠性,我也不确定它是否是一种好的做法,原因有二:第一个显而易见的原因是因为它增加了服务器负载的几倍(但有些缓存可能在这里有所帮助),而第二个是我在StackOverflow上没有找到任何类似的东西,这让我很担心。 我错过了重要的事吗?
而且,在浏览器本身之前,不是TCP,应该在我的位置做所有这些可靠性任务吗?如何在不触发任何故障机制的情况下丢失呼叫?
我把这个插件放在这里(仅供参考,我不是真的要求你看看我的代码,我只需要知道这种做法是否合理,或者是否有更好的方法提高可靠性):
$.fn.stubbornAjax = function(data, retryMSecs, callTimeoutMSecs, amountOfTries) {
var a = typeof retryMSecs !== 'undefined' ? retryMSecs : 2;
var b = typeof callTimeoutMSecs !== 'undefined' ? callTimeoutMSecs : 10;
var d = typeof amountOfTries !== 'undefined' ? amountOfTries : 5;
var c = a*d+b;
var successcb = data.success;
var errorcb = data.error;
var completecb = data.complete;
var timers = [];
var calls = [];
data.timeout = b;
var active = true;
function wipe() {
for (var t in timers)
clearTimeout(timers[t]);
for (var t in calls)
calls[t].abort();
}
data.success = function(data, textStatus, jqXHR) {
if (active) {
active = false;
wipe();
successcb(data, textStatus, jqXHR);
completecb(jqXHR, textStatus);
}
}
data.error = function(jqXHR, textStatus, errorThrown) {
if (active) {
active = false;
wipe();
errorcb(jqXHR, textStatus, errorThrown);
completecb(jqXHR, textStatus);
}
}
data.complete = null;
for (var i=0;i<=d;i++)
timers.push(setTimeout(function() {calls.push($.ajax(data));}, i*a));
timers.push(setTimeout(function() {
if (active) {
active = false;
wipe();
errorcb(null, "timeout", "timeout");
}
}, c));
}
谢谢