我有一个浏览器应用程序,在特定页面的加载下,向服务器发出ajax请求以获取一些JSON数据。返回后,处理ajax请求,一切正常。
我正在调用的服务器目前有一些恼人的间歇性问题,其中一个特别是随机导致我的ajax调用的响应没有返回任何内容而不是JSON。这个特定页面的用处是依赖于正确地从这个ajax调用返回的数据,因此在某些情况下它没有按预期返回的事实导致我的用户(以及因此我!)问题。
现在,如果我再次进行完全相同的调用,在初始调用之后立即返回错误的响应,那么服务器将返回正确的响应!
我不想进入服务器问题,它们目前正在制定中,但我还没有得到时间表可以完成的时间。因此,虽然正在解决服务器问题,但我想在我的ajax请求中添加一些catch来处理服务器返回错误响应的时间,然后立即再次进行完全相同的调用。请注意,这只是一个短期修复,可以阻止我的用户抱怨,直到服务器问题被排序!
我目前的情况与此类似:
$.ajax({
type: "GET",
data: data,
success: function(data, textStatus, jqXhr){
// Do stuff...
}
});
当服务器抖动时,data
将以未定义的形式返回。所以我真正想做的是测试data
是否undefined
,如果是的话,重新对相同的ajax请求进行相同的调用(我所做的每个测试都显示正确的响应被接收到第二轮!)。
所以,对我而言,在未定义的测试中,这感觉就像Goto
语句(喘气,震惊,恐怖!!!)的一个很好的用例,但我甚至不确定你能在JS中做到这一点而且,我知道他们的使用被认为是非常糟糕的做法。
我知道有几种方法,例如:
我可以将调用置于while(wasAjaxCallSuccessful){}
循环中,将我的ajax请求设置为同步,并且仅在wasAjaxCallSuccessful
返回时才将data
变量设置为true {{} 1}}。但这与使用Goto语句一样糟糕(如果甚至允许的话)。
另一种选择是在undefined
测试中重复调用ajax请求。但同样,这也感觉不对。
所以我想知道什么是最合适的处理方式,虽然这是非常不寻常的情况?
答案 0 :(得分:2)
基于@ Sudhir的回答here。如果data
为undefined
,则以下代码会重试ajax调用3次。
$.ajax({
url: "...",
type: "GET",
data: data,
tryCount : 0,
retryLimit : 3,
success: function(data){
if (typeof(data) == 'undefined') {
this.tryCount++;
if (this.tryCount <= this.retryLimit) {
//try again
$.ajax(this);
return;
}
return;
}
}
});
这假设当服务器“晃动”时,成功函数仍然被触发。
答案 1 :(得分:0)
while(wasAjaxCallSuccessful){}
循环,将我的ajax请求设置为同步但这与使用Goto语句一样糟糕(如果甚至允许的话)。
没有。同步(A)jax是错误的。
另一种选择是在我的data == undefined test中重复调用ajax请求。但同样,这也感觉不对。
这就是这样做的方式 - 就像递归函数一样:
function myAjax(data, callback, …) {
var args = arguments;
$.ajax({
type: "GET",
data: data,
success: function(data, textStatus, jqXhr){
if (data)
callback(data); // Do stuff...
else
myAjax.apply(null, args); // try again
},
error: function() {
myAjax.apply(null, args); // try again
}
});
}