不想等到服务器响应AJAX请求

时间:2014-09-17 03:01:36

标签: php jquery ajax long-polling abort

我使用jQuery / PHP创建了一个长轮询。它工作得很好。问题是当用户单击其他链接或刷新当前页面时,它将挂起当前页面,直到它从服务器的最后一个AJAX请求得到响应。

我在服务器端设置了大约30秒来选择最新数据,意味着如果有人发送了获取最新数据的请求,他就不能转到另一个页面或刷新当前页面,直到它返回响应。最糟糕的情况是,如果服务器没有找到最新数据,它将在30秒后发送响应。

我使用以下代码中止请求。

window.onbeforeunload = function(event) {
    xhr.abort();
}

我在执行xhr.abort()之前和之后检查了控制台,它显示readyState=1然后readyState=0。这是否意味着xhr.abort()成功执行了?但是为什么页面仍然挂在当前页面上,直到它返回响应。

请帮我解决我的问题。当用户点击其他链接或刷新页面或在页面上执行其他操作时,我不想等到服务器响应。

这是我的jQuery代码

    function setNoti(ntotal)
    {
        var t;
        xhr = $.ajax({
            type: "POST", url: myURL, data: "", dataType: "JSON", cache: false, async: true,
            success: function(data) {
                // do my work here
                clearInterval(t);
                t = setTimeout(function() {
                    setNoti(20);
                }, 1000);
                return false;
            },
            error: function()
            {
                clearInterval(t);
                t = setTimeout(function() {
                    setNoti(0);
                }, 40000);
                return false;
            }
        });
    }

2 个答案:

答案 0 :(得分:0)

您正在分配一个xhr,然后可以用来在后续调用该函数时中止该请求。

function setNoti(ntotal)
{

    if (xhr) {
        xhr.abort();
    }

    var t;
    xhr = $.ajax({
        type: "POST", url: myURL, data: "", dataType: "JSON", cache: false, async: true,
        success: function(data) {
            // do my work here
            clearInterval(t);
            t = setTimeout(function() {
                setNoti(20);
            }, 1000);
            return false;
        },
        error: function()
        {
            clearInterval(t);
            t = setTimeout(function() {
                setNoti(0);
            }, 40000);
            return false;
        }
    });
}

不需要window.onbeforeunload处理程序,这可能是在错误的时间调用的单独事件。

答案 1 :(得分:0)

我在服务器端添加了session_write_close(),它运行正常。以下帖子帮助我找到解决方案:)

Multiple AJAX requests delay each other