Javascript 奇怪的设置超时行为
以下脚本应执行以下操作: 在页面加载时,它将设置20秒的超时,然后在ajax调用中自动更新所需的内容。 如果用户单击显示“重新加载”的按钮,它将调用函数Javascript 奇怪的设置超时行为,javascript,ajax,settimeout,Javascript,Ajax,Settimeout,以下脚本应执行以下操作: 在页面加载时,它将设置20秒的超时,然后在ajax调用中自动更新所需的内容。 如果用户单击显示“重新加载”的按钮,它将调用函数reloadContent(),从而清除超时并再次设置超时 因此,基本上,如果用户手动重新加载,它应该重新启动超时,以避免调用过于接近 它工作了一半,因为计时器似乎已重置,但手动加载操作10秒后将执行reloadContentTimeout(),这是超时时间的一半 我做错什么了吗 谢谢 /** * Reload content
reloadContent()
,从而清除超时并再次设置超时
因此,基本上,如果用户手动重新加载,它应该重新启动超时,以避免调用过于接近
它工作了一半,因为计时器似乎已重置,但手动加载操作10秒后将执行reloadContentTimeout()
,这是超时时间的一半
我做错什么了吗
谢谢
/**
* Reload content
*/
function reloadContent(elementId) {
$(elementId).load(window.location.href+' '+elementId+' > *');
clearTimeout(timeoutId);
reloadContentTimeout(false);
}
/**
* Reload content every X seconds (20)
*/
var timeoutId;
function reloadContentTimeout(now)
{
now = (typeof now === 'undefined' ? true : now);
if( now ) {
reloadContent('#table-content');
}
timeoutId = setTimeout(reloadContentTimeout, 1000 * 20);
}
reloadContentTimeout(false);
因为您调用了两次
reloadContentTimeout
,这会重新分配timeoutId
。其中一个ID未被清除,事件触发的频率比它应该触发的频率更高。让我们稍微展开一下调用堆栈:
if (now) {
$(elementId).load();
clearTimeout(timeoutId);
// this reassigns timeoutId
reloadContentTimeout(false)
}
// this is where timeoutId is assigned. It gets assigned
// by this call, but also the call above.
timeoutId = setTimeout(reloadContentTimeout, 1000 * 20);
我直截了当地说:这会解决问题的
if (now) {
/* snip */
}
else {
timeoutId = /* snip */
}
因为您调用了两次
reloadContentTimeout
,这会重新分配timeoutId
。其中一个ID未被清除,事件触发的频率比它应该触发的频率更高。让我们稍微展开一下调用堆栈:
if (now) {
$(elementId).load();
clearTimeout(timeoutId);
// this reassigns timeoutId
reloadContentTimeout(false)
}
// this is where timeoutId is assigned. It gets assigned
// by this call, but also the call above.
timeoutId = setTimeout(reloadContentTimeout, 1000 * 20);
我直截了当地说:这会解决问题的
if (now) {
/* snip */
}
else {
timeoutId = /* snip */
}
请检查您的通话顺序
- 每次调用reloadContentTimeout时都会启动一个新的超时(对于可能的参数值“undefined”和“false”)
- 20秒后重新加载内容,在清除旧的超时后将启动新的超时(这是非常无用的,因为计时器已经启动)。然后启动另一个超时并重新分配timeoutId,而不清除之前创建的超时。现在有两个超时正在运行,每次超时结束后都会持续发生
检查@爆炸药丸的答案。它将帮助您解决问题请检查通话顺序
- 每次调用reloadContentTimeout时都会启动一个新的超时(对于可能的参数值“undefined”和“false”)
- 20秒后重新加载内容,在清除旧的超时后将启动新的超时(这是非常无用的,因为计时器已经启动)。然后启动另一个超时并重新分配timeoutId,而不清除之前创建的超时。现在有两个超时正在运行,每次超时结束后都会持续发生
检查@爆炸药丸的答案。它将帮助您解决问题事实上,我已经完成了console.log,看到它创建了两个超时,并且只清除了最后一个。把
放在别处
解决了它。坦斯克!实际上,我已经完成了console.log,看到它创建了两个超时,并且只清除了最后一个。把放在别处
解决了它。坦斯克!谢谢,如果重新加载内容是手动触发的(按“重新加载”按钮),则清除超时会起作用。谢谢,如果重新加载内容是手动触发的(按“重新加载”按钮),则清除超时会起作用。