2010-07-02 93 views
8

當ajax請求能夠從服務器獲得某些響應時,似乎只有成功,錯誤和完整回調纔會觸發。檢查jQuery ajax請求的狀態

因此,如果我關閉服務器,則不會執行以下錯誤回調,並且請求會自動失敗。

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error"); 
    } 
}); 

根本找不到服務器時拋出錯誤的最佳方法是什麼?

編輯 - 從我試過看,看來jQuery的內置錯誤處理不適用於JSONP或dataType:「腳本」。所以我會嘗試設置手動超時。

編輯 - 做了更多的研究,看起來不僅ajax錯誤回調不起作用,但你不能放棄與dataType腳本或jsonp的ajax請求,並且這些請求忽略超時設置。

還有一種替代方案 - jquery-jsonp插件,但它使用隱藏的iframe,我寧願避免。所以我決定創建一個手動超時,如下所示。如果請求超時,則不能中止請求,這意味着即使在超時之後,腳本仍可能會加載,但如果服務器不可用,至少會觸發一些事件。

+0

jQuery的ajax內置錯誤處理(請參閱下面的答案),您可以使用ajaxsetup來應用這些選項。 – Sphvn 2010-07-02 04:48:25

回答

7

您可以使用setTimeout,並在完整處理程序中用clearTimeout將其清除。

var reqTimeout = setTimeout(function() 
{ 
    alert("Request timed out."); 
}, 5000); 
var xhr = $.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error");   
    }, 
    complete: function() { 
    clearTimeout(reqTimeout); 
    } 
}); 
+0

看起來這是唯一的解決方案。目前爲止工作得很好,除了xhr.abort()。 Firebug給出了xhr未定義的錯誤。 – 2010-07-02 05:45:27

0

如果我沒記錯的話,jQuery會拋出異常。因此,您應該可以使用try { ... } catch() { ... }並在那裏處理。

5

jQuery.ajax已經有一個timeout首選項,如果請求超時,它應該調用你的錯誤處理程序。退房the fantastic documentation它說 - 我在這裏引用它,重點煤礦:

timeoutNumber

設置要求本地超時時間(毫秒)...

和:

error (XMLHttpRequest, textStatus, errorThrown) Function

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

+0

不幸的是,對於dataType:Jsonp或腳本都沒有超時和錯誤。 – 2010-07-02 06:31:25

+0

我正在使用JSONP,它的工作原理^^但無論漂浮你的船。 – Sphvn 2010-07-02 07:04:57

+2

對於JSON-P,請嘗試一個名爲「jquery-jsonp」的項目。 – 2010-07-02 09:37:08

0

您可以使用Jquery的AjaxSetup來處理您的錯誤處理。

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
     alert("success"); 
    }, error: function() { 
     alert("error"); 
    } 
    //AJAX SETUP "error"// 
    $.ajaxSetup({ 
     "error": function (XMLHttpRequest, textStatus, errorThrown) { 
      alert(XMLHttpRequest + ' ' + textStatus + ' ' + errorThrown); //however you want 
     } 
    }); 
0

在IE8中,可以使用:

success: function(data, textStatus, XMLHttpRequest) { 
    if("success"==textStatus&&XMLHttpRequest){ 
     alert("success"); 
    }else{ 
     alert("server down"); 
    } 
    } 

,但它不能在Chrome瀏覽器,火狐... 我試圖

1
error: function (jqXHR, textStatus, errorthrown) { 
    if (jqXHR.readyState == 0) { 
     //Network error, i.e. server stopped, timeout, connection refused, CORS, etc. 
    } 
    else if (jqXHR.readyState == 4) { 
     //HTTP error, i.e. 404 Not found, Internal Server 500, etc. 
    } 
} 

的XMLHttpRequest的使用readyState確定Ajax請求的狀態。 'readyState'保存XMLHttpRequest的狀態。

  • 0:請求未初始化
  • 1:服務器連接建立
  • 2:請求接收
  • 3:處理請求
  • 4:請求完成和響應準備