2010-04-27 94 views
7

有沒有辦法處理jQuery中的AJAX回調引發的異常,除了向每個回調添加try..catch塊?在這種情況下不會調用錯誤函數。在jQuery AJAX回調中引發的異常吞噬?

$.ajax(
{ 
    url: 'myurl.rails', 
    success: function(data) 
    { 
     throw 'Oh no!'; 
    }, 
    error: function (xhr, textStatus, errorThrown) 
    { 
     console.log('AJAX call failed', xhr, textStatus, errorThrown); 
    }    
}); 

回答

5

如果你看看jQuery 1.4.2的非縮小版本,相關的行是5264到5274. jQuery只是調用應用於設置對象(如果存在)的success函數,而不關心什麼函數返回或拋出。

你可以做什麼,而不是使用是一樣jQuery.ajaxSetup()如此:

jQuery.ajaxSetup({ 
    success: function() { 
     try { 
      if (this.mysuccess) { 
       this.mysuccess.apply(this, arguments); 
      } 
     } 
     catch(err) { 
      // whatever 
     } 
    } 
}); 

並使用mysuccess(或任何你更願意稱呼它)在個人jQuery.ajax調用,而不是success

+0

我很好奇,如果有人知道*爲什麼*它不關心是否引發異常:http://stackoverflow.com/questions/11800349/why-does-jquery-swallow-exceptions-in-ajax-success-回調 – 2012-08-03 17:19:10

0

你有沒有看着任何的jQuery的全球AJAX功能,如ajaxSetupajaxError

+1

正如賈斯汀所說,錯誤/ ajaxError回調是針對失敗的請求,而不是在成功回調中的應用程序代碼中拋出的異常。 – MikeWyatt 2010-04-27 16:34:22

0

error回調旨在用於請求本身出現問題時。根據文檔:

如果請求失敗將被調用的函數。該函數傳遞三個參數:XMLHttpRequest對象,一個描述發生的錯誤類型的字符串,以及一個可選的異常對象(如果發生的話)。第二個參數(除了null)的可能值是「超時」,「錯誤」,「未修改」和「解析錯誤」。

所以,如果取而代之的是你回來的數據有問題,那麼你應該將success回調中處理它 - 也許通過登錄它安慰,或通知用戶。

+0

我在我的網站中使用了相當多的AJAX,並且在try..catch塊中使用日誌記錄封裝每個成功回調並不理想。 – MikeWyatt 2010-04-27 14:38:26

+0

您在網站上看到的錯誤是否存在特定類型?你究竟看到了什麼,一旦你發現錯誤,你打算做什麼? – 2010-04-27 15:07:49

+0

我只想記錄可能拋出的任何異常。特定的異常類型不重要,除非是意外。 – MikeWyatt 2010-04-27 15:23:01