我正在开发一个聊天应用程序,它会在超时时轮询服务器。
如果随着时间的推移,没有任何近期活动,则超时会增加。
函数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()
中设置的超时,这会导致消息再次重复。你能想出一种让它起作用的方法吗?
答案 0 :(得分:1)
使用诸如success
或complete
之类的ajax回调函数来触发新的投票。
答案 1 :(得分: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);
}