JQuery Ajax - 如何在进行Ajax调用时检测网络连接错误

Sun*_*oot 84 javascript ajax jquery

我有一些Javascript JQuery代码,每隔5分钟对服务器进行一次Ajax调用,这是为了让服务器会话保持活动并保持用户登录.我$.ajax()在JQuery中使用方法.这个函数似乎有一个'错误'属性,我试图在用户的互联网连接断开时使用,以便KeepAlive脚本继续运行.我正在使用以下代码:

var keepAliveTimeout = 1000 * 10;

function keepSessionAlive()
{
    $.ajax(
    {
        type: 'GET',
        url: 'http://www.mywebapp.com/keepAlive',
        success: function(data)
        {
            alert('Success');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert('Failure');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我会在屏幕上每10秒钟在一个警告框中弹出"成功",这很好.但是,一旦我拔下网线,我就什么也得不到,我期待错误功能被调用并看到"故障"警告框,但没有任何反应.

假设'错误'功能仅适用于从服务器返回的非'200'状态代码,我是否正确?有没有办法在进行Ajax调用时检测网络连接问题?

小智 91

// start snippet
error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (XMLHttpRequest.readyState == 4) {
            // HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
        }
        else if (XMLHttpRequest.readyState == 0) {
            // Network error (i.e. connection refused, access denied due to CORS, etc.)
        }
        else {
            // something weird is happening
        }
    }
//end snippet
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.在您提供给$ .ajax的错误函数中,第一个参数提供各种状态信息.即使您没有设置超时,它也会这样做. (4认同)

Kru*_*ule 13

你应该添加:在timeout: <number of miliseconds>,某个地方$.ajax({}).此外,cache: false,在一些场景中可能会有所帮助.

$ .ajax有详细记录,您应该检查那里的选项,可能会找到有用的东西.

祝好运!

  • 有很多东西根本没有记录在 Ajax 中,并且以某种方式隐藏了:( (2认同)

Mar*_*o Z 9

由于我无法复制该问题,我只能建议尝试在ajax调用上超时.在jQuery中,您可以使用$ .ajaxSetup设置它(对于所有$ .ajax调用它将是全局的),或者您可以专门为您的调用设置它:

$.ajax({
    type: 'GET',
    url: 'http://www.mywebapp.com/keepAlive',
    timeout: 15000,
    success: function(data) {},
    error: function(XMLHttpRequest, textStatus, errorThrown) {}
})
Run Code Online (Sandbox Code Playgroud)

JQuery会在你的通话中注册15秒超时; 之后,如果没有来自服务器的http响应代码,jQuery将执行错误回调,并将textStatus值设置为"timeout".有了这个,你至少可以停止ajax调用,但是你无法区分真正的网络问题和连接丢失.