【发布时间】:2013-08-14 06:34:45
【问题描述】:
我正在开发一个聊天应用程序,它会在超时时轮询服务器。
如果随着时间的推移,最近没有任何活动,超时会增加。
函数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() 中设置的超时,从而导致消息再次重复。你能想出一种方法来让它发挥作用吗?
【问题讨论】:
-
你明白
setTimeout是在指定延迟后运行函数,而不是在一定时间后停止函数吗? -
是的,但是我读到超时只是在功能完成后才开始,似乎不是这样..
-
不,这不是发生的事情。
setTimeout只是在第二个参数指定的时间之后执行第一个参数。 developer.mozilla.org/en-US/docs/Web/API/window.setTimeout
标签: javascript jquery ajax timeout