jQuery ajax txtStat不返回“超时”但是“错误”

时间:2012-03-15 03:09:33

标签: jquery ajax timeout

Netbean 6.9.1
GlassFish 3.0.1
jQuery 1.6.2

我正在测试我的网络应用程序的超时情况。

我对“超时”的理解是在发送Ajax请求时,如果花了指定的时间(如30秒),则会触发超时回调函数。

我也读过jQuery Timeout:

timeoutNumber

设置请求的超时(以毫秒为单位)。这将覆盖使用$ .ajaxSetup()设置的任何全局超时。超时时间从$ .ajax调用点开始;如果其他几个请求正在进行且浏览器没有可用的连接,则请求可能会在发送之前超时。在jQuery 1.4.x及更低版本中,如果请求超时,XMLHttpRequest对象将处于无效状态;访问任何对象成员可能会抛出异常。仅在Firefox 3.0+中,超时无法取消脚本和JSONP请求;即使在超时时间之后到达,脚本也会运行。

但是当我测试超时时,调用错误函数并且当txtStat应该是“超时”时显示“错误”。这是我的测试步骤:

测试步骤:

  1. 启动Glassfish服务器
  2. 转到测试页面(foo.jsp)
  3. 停止Glassfish服务器
  4. 点击foo.jsp上的按钮发送ajax请求。
  5. 预期结果:

    发送Ajax请求但无法访问服务器并调用错误回调函数,其参数:txtStat应具有值“timeout”。

    实际结果:

    调用错误回调函数,其参数:txtStat的值为“error”

    这是预期的行为还是我对超时的理解错误了?

    我的ajax代码:

    $.ajax({
            url: "../resources/plan/list/some",
            type: "get",
            dataType: "json",
            timeout: 30000,
            success: function(data, txtStat, xhr) {
                console.log("success")
            },
            error: function(xhr, txtStat, errThrown) {
                if(txtStat === "timeout") {
                    console.log("timeout");
                }
                else { //txtStat === "error", "abort", "parseerror"
                    console.log(txtStat);
                }
            },
            complete: function(xhr, txtStat) {
                console.log("completed");
            }
        });
    

1 个答案:

答案 0 :(得分:4)

事实上,您对请求超时的理解并不完全正确。当请求超过一定时间时会发生超时,但是当服务器关闭时,您会发现响应立即返回。只需在浏览器中尝试导航到未运行的Web应用程序页面即可。例如:

enter image description here

立即完成,因为浏览器甚至无法连接。

要导致超时条件,请保持服务器正常运行,但请求一个类似Thread.sleep(60000)的页面 - 服务器将接受请求,但在配置的ajax时间用完之前不发送响应。

是超时:当接受请求但未及时发送响应时。