2011-03-24 150 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>'); 
        });