【问题标题】:Check status of a jQuery ajax request检查 jQuery ajax 请求的状态
【发布时间】:2011-03-10 22:41:16
【问题描述】:

似乎只有当 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。所以我决定按照下面的建议创建一个手动超时。如果超时,您无法中止请求,这意味着即使在超时后脚本仍可能加载,但至少会在服务器不可用时触发。

【问题讨论】:

  • Jquery 的 ajax 内置了错误处理(见下面我的回答)你可以使用 ajaxsetup 来应用这些选项。

标签: ajax jquery jsonp


【解决方案1】:

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

【讨论】:

  • 看来这是唯一的解决方案。到目前为止工作良好,除了 xhr.abort()。 Firebug 给出 xhr 未定义的错误。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    jQuery.ajax 已经有一个timeout 首选项,它应该在请求超时时调用您的错误处理程序。看看the fantastic documentation,上面写着——我会在这里引用它,强调我的:

    timeoutNumber

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

    和:

    error (XMLHttpRequest, textStatus, errorThrown) Function

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

    【讨论】:

    • 不幸的是,对于 dataType: Jsonp 或脚本,超时和错误都不起作用。
    • 我正在使用 JSONP,它可以工作 ^^ 但不管你的船是什么。
    • 对于 JSON-P,尝试一个名为 jquery-jsonp 的项目。
    【解决方案4】:

    您可以使用 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】:

      在ie8中,可以使用:

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

      但它无法在 chrome、firefox 上运行... 我试过了

      【讨论】:

        【解决方案6】:
        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:请求完成,响应准备就绪

        【讨论】:

          猜你喜欢
          • 2018-12-21
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 2019-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多