jquery ajax忽略500状态错误

时间:2011-03-24 14:08:02

标签: jquery jquery-callback

我正在向App Engine应用程序发出一些GET请求,在Chrome中进行测试。虽然我可以在javascript控制台中看到一些调用导致500服务器错误,但我似乎无法找到在我的jQuery代码中捕获此错误,尽管读取了许多类似的SO线程。我知道它表示服务器端错误,但我仍然希望能够从我的javascript中捕获这样的错误。

我需要捕获错误,以便我可以计算响应次数(成功或其他)并在收到所有呼叫响应时触发另一个功能。

Chrome控制台输出:

GET http://myapp.com/api?callback=jQuery12345&params=restOfParams 500 (Internal Server Error)

我的电话:

  function makeCall() {
    var count = 0;
    var alldata = $('#inputset').val();
    var rows = alldata.split('\n');
    var countmatch = rows.length;
    for (i=0;i<rows.length;i++) {
      data["param"] = rows[i]["val"];
      $.ajax({
              url: apiUrl,
              type: 'GET',
              data: data,
              dataType: 'jsonp',
              error: function(){
                  alert('Error loading document');
                  count +=1;
              },
              success: function(responseJson) {
                            count +=1;
                            var res = responseJson.results;
                            if (count == countmatch) {
                              allDoneCallback(res);
                            }
                        },
             });
    }
}

我尝试了以下一些方法:
添加:

statusCode: {500: function() {alert('err');}}

致电。

使用:

  $().ready(function(){
     $.ajaxSetup({
       error:function(x,e) {
             if(x.status==500) {
               alert('Internel Server Error.');
             }
           }
      });
   });

有人会就如何捕获500响应提出建议吗?

由于 奥利

更新

根据回复,我的jquery代码似乎是正确的,但由于某种原因,它只会捕获从我的应用程序收到的某些500个响应。这可能是App Engine如何返回错误的问题(我对此不太了解),或者jquery如何使用jsonp处理错误 - 这一点在this文章的最后一段中进行了简要讨论。 / p>

我通过使用jquery-isonp来实现这一点,{{3}}抓住了应用程序抛出的所有500个状态。

3 个答案:

答案 0 :(得分:4)

看起来你并没有正确使用jQuery的document.ready绑定。 $().ready(...)版本或多或少已弃用。请尝试其中之一:

$(document).ready(function() {
    $.ajaxSetup({
        error: function(x, e) {
            if (x.status == 500) {
                alert('Internel Server Error.');
            }
        }
    });
});

the shorthand

$(function() {
    $.ajaxSetup({
        error: function(x, e) {
            if (x.status == 500) {
                alert('Internel Server Error.');
            }
        }
    });
});

答案 1 :(得分:1)

通过将jQuery从1.9.1升级到2.1.1解决了这个问题 - 现在它开始在服务器响应上调用.error()(在忽略500响应并等到超时结束之前)。

限制:jQuery 2.1.1不支持IE8及以下版本(因为IMO不应该支持你)

答案 2 :(得分:1)

我有一个类似的问题,我使用.done,.fail,.always的jquery的promise函数,如果我遇到500内部服务器错误,那么它不会触发任何函数(完成,失败,总是,错误)。非常奇怪。

最后我在.ajax选项中添加了一个超时,当它达到超时时会抛出错误并运行.fail方法。

searchify.myAjaxSearchTerms = $.ajax({
                        'url': url,
                        type: "GET",
                        'dataType': 'jsonp',
                        'jsonp': 'json.wrf',
                        'jsonpCallback': searchify.cbFunc,
                        timeout: 4000, //needed for 500 errors - will go to fail block on timeout
                        beforeSend: searchify.beforeSendAutocomplete

                    });
searchify.myAjaxSearchTerms.fail(function(XHR, status, error){
                        searchify.clearForm();
                        searchify.renderWarningForNoQuery('<div class="notify-bubble"><span class="icon" data-icon="8" aria-hidden="true"></span><span>Sorry. We had a problem performing that search...<br/>Please try again<br/>Enter a <strong>product name</strong>, <strong>catalogue number</strong> or <strong>keyword</strong></span></div>');
                    });