javascript - 聊天应用程序轮询

标签 javascript jquery ajax timeout

我正在开发一个聊天应用程序,它会在超时时轮询服务器。 如果随着时间的推移,最近没有任何事件,超时就会增加。 函数 loadNew() 对服务器执行 ajax 调用,服务器以消息数据进行响应。

pollTimeoutTime = 500;
function poll() {
    pollTimeout = setTimeout(function(){
        loadNew();
        if (!new_messages_count) {
            //Increasing delay between polls as no messages are incoming to a maximum of 1 minute/60 seconds
            if (pollTimeoutTime < 60000) pollTimeoutTime = pollTimeoutTime * 1.25;
        } 
        else {
            //Reset delay between poll to default of 0.5 seconds
            pollTimeoutTime = 500;
        }
        poll();
    },pollTimeoutTime);
}

我遇到的问题是超时函数不会等待函数 loadNew() 完成,这会导致如果超时低于函数中的 ajax 调用完成所需的时间。 因此,服务器多次响应相同的数据,从而导致聊天中消息的重复显示。

有没有办法让超时仅在 loadNew() 完成获取和显示数据后触发?

编辑:使用@Brad M的答案后,它不再重复消息。我仍然希望有一种方法可以在用户提交消息后进行民意调查,以便立即显示新消息。这会干扰 loadNew() 中设置的超时,从而导致消息再次重复。你能想出一种方法让它发挥作用吗?

最佳答案

如果没有看到 loadNew 函数,一个简单的解决方法可能是更改该函数以返回您的 ajax 调用 (return $.ajax({...}); )并更改您发布的代码:

pollTimeoutTime = 500;
function poll() {
    pollTimeout = setTimeout(function () {
        loadNew().done(function (result) {
            if (!new_messages_count) {
                //Increasing delay between polls as no messages are incoming to a maximum of 1 minute/60 seconds
                if (pollTimeoutTime < 60000) pollTimeoutTime = pollTimeoutTime * 1.25;
            } else {
                //Reset delay between poll to default of 0.5 seconds
                pollTimeoutTime = 500;
            }
            poll();
        });
    }, pollTimeoutTime);
}

关于javascript - 聊天应用程序轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195623/

相关文章:

javascript - json,如何检查 key ?

jquery - 仅更改 jqGrid 子网格标题样式

jquery - 在Django中重新加载表数据而不刷新页面

javascript - 在 HTML 中加载多行文本(每 60 秒逐行)的最佳方法是什么?

javascript - 选择图像后的内容

javascript - Angular 2单击事件中的动态函数名称

javascript - 使用 Javascript 动态呈现 Facebook 之类的按钮

javascript - 使用 jQuery 更改 html 位置

php - 事件驱动的进度条 - Javascript

jQuery 验证器和使用 AJAX 的自定义规则