JS Ajax短期黑客?

时间:2013-03-18 12:12:38

标签: javascript ajax jquery

我有一个浏览器应用程序,在特定页面的加载下,向服务器发出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请求。但同样,这也感觉不对。

所以我想知道什么是最合适的处理方式,虽然这是非常不寻常的情况?

2 个答案:

答案 0 :(得分:2)

基于@ Sudhir的回答here。如果dataundefined,则以下代码会重试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
        }
    });
}