Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 奇怪的设置超时行为_Javascript_Ajax_Settimeout - Fatal编程技术网

Javascript 奇怪的设置超时行为

Javascript 奇怪的设置超时行为,javascript,ajax,settimeout,Javascript,Ajax,Settimeout,以下脚本应执行以下操作: 在页面加载时,它将设置20秒的超时,然后在ajax调用中自动更新所需的内容。 如果用户单击显示“重新加载”的按钮,它将调用函数reloadContent(),从而清除超时并再次设置超时 因此,基本上,如果用户手动重新加载,它应该重新启动超时,以避免调用过于接近 它工作了一半,因为计时器似乎已重置,但手动加载操作10秒后将执行reloadContentTimeout(),这是超时时间的一半 我做错什么了吗 谢谢 /** * Reload content

以下脚本应执行以下操作:

在页面加载时,它将设置20秒的超时,然后在ajax调用中自动更新所需的内容。 如果用户单击显示“重新加载”的按钮,它将调用函数
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,看到它创建了两个超时,并且只清除了最后一个。把
放在别处
解决了它。坦斯克!谢谢,如果重新加载内容是手动触发的(按“重新加载”按钮),则清除超时会起作用。谢谢,如果重新加载内容是手动触发的(按“重新加载”按钮),则清除超时会起作用。