2012-02-27 72 views
15

我使用jQuery.ajax()連接到我的後端服務。我配置了一個error()處理程序和一個statusCode()處理程序。它們都可以正常工作,但是當我的statusCode處理程序被觸發時,錯誤處理程序也會觸發(錯誤處理程序實際上是先觸發的)。我寧願這不會發生。我認爲這是可能的,而不必破解錯誤處理程序代碼?jQuery ajax - 當調用statusCode()回調時避免錯誤()回調

我的代碼看起來是這樣的:

$.ajax({ 
    ... 
    error: function(...) { 
     // process a general type of error here 
    }, 
    statusCode: { 
     401: function() { 
      // process a specific authentication failure 
     } 
    }     
}); 

那麼,如何避免錯誤()處理器射擊時的HTTP狀態代碼是401?

感謝您的閱讀!

+2

我不知道這將是值得請求jQuery開發團隊,使它所以當你返回false在「的StatusCode」處理程序將防止AJAX事件傳播到'錯誤'處理程序。當然,這不需要太多的努力,同時使編寫未經身份驗證的請求都具有相同全局處理程序的應用程序變得更加容易,即:將用戶返回到登錄屏幕的一個功能。 – 2012-10-31 21:06:48

+0

@JoshMc:好主意! – David 2014-04-22 13:26:27

回答

6

沒有黑客jQuery.ajax,你不能。對我而言,jQuery的ajax方法是圖書館的痛處之一。爲了更明智的請求處理,我建議您查看superagent或其他獨立庫。

+0

雖然不是我想要聽到的,但我想盡可能接近我的答案。謝謝。 – 2012-03-25 10:56:49

10

您可以輕鬆地檢查錯誤回調中的狀態碼。第一個參數應該是XMLHttpRequest(或jqHXR取決於您的jQuery版本)對象。相應地檢查錯誤句柄的狀態代碼的'status'屬性。

E.g.

error: function(a, b, c){ 
    if(a.status != 401){ 
    // handle other errors except authentication 

    } 
} 
+0

是的,但我希望避免不必像我在原始文章中提到的那樣破解錯誤處理程序。從我的理解,這不能做到這一點,我覺得有點奇怪... – 2012-03-25 10:54:47

+0

@LeeFrancis,哦,我明白你的意思了。難道你不能只寫一個使用$ .ajax調用的包裝器。然後,您可以指定要在錯誤處理程序中抑制哪些狀態代碼?我爲所有ajax調用編寫了封裝器,所以我可以在一個地方做任何調整。只是一個想法... – 2012-03-27 07:57:06

+0

是的,這或多或少是我最終做的。不過,當我無意中手動檢查狀態碼時,我覺得我打算讓圖書館預定義的處理程序可用(成功等)。 – 2012-03-27 12:12:23

2

您可以嘗試使用ajaxSetup和beforeSend自動調整你的Ajax請求的錯誤處理程序:

$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
    if (typeof settings.error === 'function') { 
     var errorfunc = settings.error; 
     settings.error = function(jqXHR2, textStatus, errorThrown) { 
     if (jqXHR2.status !== 401) errorfunc(jqXHR2, textStatus, errorThrown); 
     }; 
    } 
    } 
}); 

在我的情況下,這個工作。

+0

非常好。但是,如果在錯誤處理程序中設置了由'$ .ajax'返回的延遲中的'fail()',它可以工作嗎? – Francisc 2013-08-29 15:22:09

+0

我還沒有嘗試過,但根據jQuery jqXHR對象的回調執行順序(失敗前的錯誤,請參閱http://api.jquery.com/jQuery.ajax/),您可能可以修改函數中的延遲迴調替換原來的settings.error。 – user2043553 2013-09-15 12:41:33

5

改進以前需要硬編碼您不想觸發通用事件處理程序的狀態代碼的變通辦法。

在我看來,編輯你的錯誤處理程序是比較安全的,因爲beforeSend可能會被其他用途覆蓋,因此你可以在這些調用中無意中觸發通用錯誤處理程序。 (如果有人覆蓋錯誤回調,他們希望它會影響錯誤處理,如果他們修改beforeSend回調他們不會)。

所以,你會得到:

function ajaxError (jqXHR, textStatus, errorThrown) 
{ 
    if (jqXHR.status in this.statusCode) return; 
    // Handle generic events here. 

} 
+0

這很聰明。 – Francisc 2013-08-29 13:26:30