2010-07-02 78 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:请求完成和响应准备