检查jQuery ajax请求的状态

时间:2010-07-02 04:26:25

标签: ajax jquery jsonp

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

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

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

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

编辑 - 从我试过和阅读的内容看来,jQuery的内置错误处理不适用于JSONP或dataType:“script”。所以我打算尝试设置手动超时。

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

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

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

jQuery.ajax已经有timeout首选项,如果请求超时,它应该调用你的错误处理程序。查看the fantastic documentation,其中说 - 我在这里引用它,强调我的:

  

timeoutNumber

     

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

  

error (XMLHttpRequest, textStatus, errorThrown) Function

     

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

答案 2 :(得分:2)

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.
    }
}

使用XML {HttpRequest的readyState来确定ajax请求的状态。    'readyState'保存XMLHttpRequest的状态。

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

答案 3 :(得分:0)

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

答案 4 :(得分: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
        }
    });

答案 5 :(得分:0)

<8>在ie8中,可以使用:

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

但它不适用于chrome,firefox ...... 我试过了

相关问题