0

我正在开发一个聊天应用程序,它会在超时时轮询服务器。如果随着时间的推移,最近没有任何活动,则超时会增加。该函数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(),从而导致消息再次重复。你能想出一种方法来让它发挥作用吗?

4

2 回答 2

1

使用 ajax 回调函数,例如successcomplete来触发新的轮询。

于 2013-08-12T19:58:21.247 回答
1

在没有看到您的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);
}
于 2013-08-12T20:03:03.860 回答