3

我有一个浏览器应用程序,它在加载特定页面时向服务器发出 ajax 请求以获取一些 JSON 数据。返回后,ajax 请求被处理,一切都很好。

我正在调用的服务器目前有一些烦人的间歇性问题,特别是随机导致我的 ajax 调用的响应不返回任何内容而不是 JSON。这个特定页面的有用性依赖于从这个 ajax 调用正确返回的数据,因此在某些情况下它没有按预期返回的事实导致我的用户(因此,我!)出现问题。

现在,如果我再次进行完全相同的调用,在初始调用返回错误响应之后,服务器将立即返回正确响应!

我不想涉及服务器问题,它们目前正在解决中,但我还没有时间表确定何时完成。因此,在解决服务器问题的同时,我想在我的 ajax 请求中加入某种捕获,以处理服务器返回错误响应的时间,然后立即再次进行完全相同的调用。请注意,这只是阻止我的用户抱怨的短期修复,直到服务器问题得到解决!

我目前拥有的与此类似:

$.ajax({
  type: "GET",
  data: data,
  success: function(data, textStatus, jqXhr){

    // Do stuff...

  }
});

当服务器抛出一个摆动时,data它会以未定义的形式返回。所以我真正想做的是测试是否dataundefined,如果是的话,重新对同一个ajax请求进行相同的调用(我所做的每个测试都显示第二次收到了正确的响应!)。

所以,对我来说,这感觉像是未定义测试中声明(喘气,震惊,恐怖!!!)的一个很好的用例,Goto但是,我什至不确定你可以在 JS 中做到这一点,而且,我知道它们的用途是被认为是非常糟糕的做法。

我知道有几种方法可以解决它,例如:

  • 我可以将调用放入while(wasAjaxCallSuccessful){}循环中,将我的 ajax 请求设置为同步,并且仅将wasAjaxCallSuccessful变量设置为 true 如果data返回为 not undefined。但这感觉和使用 Goto 语句一样糟糕(如果允许的话)。

  • 另一种选择是在我的data == undefined测试中重复调用 ajax 请求。但同样,这也感觉不对。

所以我想知道什么被认为是处理这种情况的最合适的方法,尽管这很不寻常,场景?

4

2 回答 2

2

基于@Sudhir在此处的回答。data如果is ,下面的代码将重试 ajax 调用 3 次undefined

$.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;
        }

    }
});

这是假设当服务器“抛出一个摆动”时,仍然会触发成功函数。

于 2013-03-18T12:29:46.333 回答
0

while(wasAjaxCallSuccessful){}循环,将我的 ajax 请求设置为同步

但这感觉和使用 Goto 语句一样糟糕(如果允许的话)。

不,同步 (A)jax 是这里的问题。

另一种选择是在我的 data == undefined 测试中重复调用 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
        }
    });
}
于 2013-03-18T12:52:14.220 回答