检查jQuery ajax请求的状态

似乎只有在ajax请求能够从服务器获得某些响应时才会触发成功,错误和完整回调。

因此,如果我关闭服务器,则不会执行以下错误回调,并且请求将以静默方式失败。

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

什么是在根本无法访问服务器时抛出错误的最佳方法。

编辑 – 从我的尝试和阅读看来,jQuery的内置error handling不适用于JSONP或dataType:“script”。 所以我要尝试设置手动超时。

编辑 – 做了一点研究,看起来不仅ajax错误回调不起作用,而且你不能用dataType脚本或jsonp中止ajax请求,这些请求忽略超时设置。

有一个替代方案 – jquery-jsonp插件,但它使用隐藏的iframe,我宁愿避免。 所以我已经决定创建一个手动超时,如下所示。 如果请求超时,则无法中止请求,这意味着即使在超时后脚本仍可能仍然加载,但如果服务器不可用,则至少会触发某些内容。

您可以使用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); } }); 

jQuery.ajax已经有一个timeout偏好,如果请求timeout ,它应该调用你的error handling程序。 查看精彩的文档说 – 我在这里引用它,强调我的:

timeoutNumber

设置请求的本地超时(以毫秒为单位)…

和:

error (XMLHttpRequest, textStatus, errorThrown) Function

请求失败时要调用的函数。 该函数传递三个参数:XMLHttpRequest对象,描述发生的错误类型的字符串和可选的exception对象(如果发生)。 第二个参数的可能值(除了null)是“timeout” ,“error”,“notmodified”和“parsererror”。 这是一个Ajax事件。

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

使用readyH of XMLHttpRequest来确定ajax请求的状态。 ‘readyState’保存XMLHttpRequest的状态。

  • 0:请求未初始化
  • 1:建立服务器连接
  • 2:收到请求
  • 3:处理请求
  • 4:请求完成并且响应准备就绪

如果我没记错的话,jQuery会抛出exception。 因此,您应该能够使用try { ... } catch() { ... }并在那里处理它。

您可以使用Jquery的AjaxSetup来处理error handling。

  $.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 } }); 

在ie8中,可以使用:

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

但它不能用于chrome,firefox ……我试过了