2011-03-24 149 views
13

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

我需要捕获错误,以便可以统计响应的数量(成功或否则),并在收到所有呼叫响应时触发另一个函数。

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响应的建议?

感谢 奥利

UPDATE:

基础上的反应,我的jQuery代码看起来是正确的,但由于某些原因,它只会赶上从我的应用程序收到一定的500个响应。这可能是App Engine如何返回错误(我对此不太了解)或者jquery如何使用jsonp处理错误的问题 - 在this文章的最后一段中简要讨论了这一点。

我通过使用jquery-isonp得到了这个工作,它抓住了应用程序抛出的所有500个状态。

+0

不应该是'statusCode'而不是'status'吗? – 2014-08-25 18:50:51

回答

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.'); 
      } 
     } 
    }); 
}); 
+0

嗨马特,谢谢你回到我身边。不幸的是,我尝试了这两个建议,但仍然没有运气..这很奇怪,我不知道铬控制台是否承认500状态,但jQuery不是由于某种原因?我在Chrome 10.0.648.151中使用jquery 1.5.1。我现在将在FF中测试它。 – oli 2011-03-24 14:29:31

+0

我没有看到你的代码有什么问题 - 错误回调应该像书面一样工作。你可以发布[SSCCE](http://sscce.org/)吗? – 2011-03-24 14:31:43

+0

嗨马特,不幸的是我现在不能这样做(我打电话的应用程序是在公司内部安置的);不过,我认为我已经设法进一步隔离这个问题:[App Engine](http://code.google.com/appengine/docs/python/tools/webapp/redirects.html)应用程序返回500它在内部触发一个错误(jquery没有检测到这个);如果我使用它的self.error(500)功能,jquery会检测它。就我在浏览器中看到的情况而言,它们几乎都是同样的东西,所以我仍然不明白为什么要正确识别。 – oli 2011-03-24 17:34:29

1

从1.9.1至2.1.1升级jQuery的问题解决了 - 现在它开始叫.error()正确的服务器响应(前它会忽略500响应并等待超时结束)。

限制:jQuery的2.1.1不支持IE8及以下(如IMO你不应该)

1

我有一个类似的问题,我用的.done,.fail,。总是jQuery的承诺的功能,如果我遇到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>'); 
        });