代码之家  ›  专栏  ›  技术社区  ›  Seth Archer Brown

检查jquery ajax请求的状态

  •  8
  • Seth Archer Brown  · 技术社区  · 15 年前

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

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

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

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

    编辑——根据我尝试和阅读的内容,jquery的内置错误处理似乎不适用于jsonp或数据类型:“script”。所以我将尝试设置手动超时。

    编辑-做了更多的研究,它看起来不仅仅是Ajax错误回调不起作用,而且您不能用数据类型脚本或JSONP中止Ajax请求,这些请求忽略超时设置。

    还有一种选择——jquery jsonp插件,但它使用隐藏的iframes,我宁愿避免。所以我决定创建一个手动超时,如下所示。如果请求超时,您就不能中止它,这意味着即使在超时之后脚本仍然可以加载,但是如果服务器不可用,至少会触发一些东西。

    6 回复  |  直到 7 年前
        1
  •  7
  •   Matthew Flaschen    15 年前

    你可以使用 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);
      }
    });
    
        2
  •  5
  •   Evadne Wu    15 年前

    jquery.ajax已经有了 timeout 如果请求超时,它应该调用错误处理程序。退房 the fantastic documentation 上面写着“我在这里引用它,强调我的:

    timeoutNumber

    设置请求的本地超时(毫秒)

    还有:

    error (XMLHttpRequest, textStatus, errorThrown) Function

    请求失败时要调用的函数。该函数传递三个参数:xmlhttpRequest对象、描述发生的错误类型的字符串以及可选的异常对象(如果发生)。第二个参数(除空值外)的可能值为 “超时” “错误”、“NotModified”和“ParserError”。这是一个Ajax事件。

        3
  •  2
  •   josepainumkal    7 年前
    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.
        }
    }
    

    使用 readyState 以确定Ajax请求的状态。 “readystate”保存xmlhttprequest的状态。

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

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

        5
  •  0
  •   Sphvn Frebin Francis    15 年前

    可以使用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
            }
        });
    
        6
  •  0
  •   Koerr    15 年前

    在IE8中,可以使用:

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

    但它不能在Chrome、Firefox上工作… 我试过