我正在开发一个聊天应用程序,它在超时时轮询服务器。如果随着时间的推移,最近没有任何活动,则超时时间会增加。函数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);
}
我遇到的问题是,timeout函数不等待函数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);
}
使用ajax回调函数(如success
或complete
)来触发新的轮询。