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

Posted

技术标签:

【中文标题】不想等到服务器响应 AJAX 请求【英文标题】:Do not want to wait till server response to the AJAX request 【发布时间】: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 中以“响应”时间中止。 【参考方案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

【讨论】:

以上是关于不想等到服务器响应 AJAX 请求的主要内容,如果未能解决你的问题,请参考以下文章

迅速,我如何才能等到收到服务器响应后再继续?

Mock.js开发中拦截Ajax

Ajax的基本请求/响应模型

ajax响应时长怎样设置?

10秒后服务器响应时如何使用ajax发送请求?

AJAX请求服务器,响应状态码为200,但调用error函数