【问题标题】:Do not want to wait till server response to the AJAX request不想等到服务器响应 AJAX 请求
【发布时间】:2014-09-17 03:01:36
【问题描述】:

我使用 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;
            }
        });
    }

【问题讨论】:

  • "这是否意味着 xhr.abort() 执行成功?您将看到它在 Firebug 中以“响应”时间中止。

标签: php jquery ajax long-polling abort


【解决方案1】:

您正在分配一个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 处理程序,因为它是一个单独的事件,很可能在错误的时间被调用。

【讨论】:

  • 感谢您的回复...但没有锻炼。 xhr 是全局变量,可以在 setNoti() 函数之外访问
  • 如果已定义,它将被中止。可能您还有一些其他代码与 xhr 变量混淆。
【解决方案2】:

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

Multiple AJAX requests delay each other

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多