2017-09-29 248 views
-2

我试图用JavaScript每20秒刷新一个div。这是我的代码:奇怪的行为与SetTimeout

$(document).ready(function(){ 
    refreshTable(); 
    updateTable(); 
}); 

function updateTable(){ 
    setTimeout(refreshTable, 20000); 
    updateTable(); 
} 

function refreshTable(){ 
    $('#table_list').load('table') 
} 

一旦页面已经准备好,我要开始倒计时。但是这段代码每3秒更新一次表格。有人能帮我吗?我究竟做错了什么?

P.s .:我看到这是一个常见问题,但我看到的任何问题都能帮助我。

+0

'updateTable()'调用应该在'setTimeout'回调中,而不是在它之后。 – Xufox

+0

@Viet代码完全够用,但是错误太明显了,没有任何调试尝试。 – Xufox

+0

你说得对。我的错。 – Viet

回答

2

当文档准备就绪时,您可以拨打updateTable

20秒钟后,它会调用refreshTable立即再次呼吁updateTable。所以它排队了另一个refreshTable,然后再次击中updateTable再次。这将它粘到一个无限循环中...或者至少是堆栈溢出。

您需要:

  • 呼叫updateTable从内refreshTable代替updateTable
  • 使用setIntervalready处理程序,而不是在所有
2

你有无限递归:

function updateTable(){ 
    setTimeout(refreshTable, 20000); 
    updateTable(); // Infinite recursion. 
} 

您应该改用使你的setTimeout循环setIinterval。

0
$(document).ready(function(){ 
    window.setInterval(function(){ 
     $('#table_list').load('table'); 
    }, 20000); 
}); 

使用setTimeout这可能有助于你出去了,至少我希望如此:D

1

正如其他答案指出的那样,您的updateTable函数中有无限递归。你也可以使用setInterval的,它定期运行指定的refreshTable功能:

$(document).ready(function(){ 
    refreshTable(); 
    setInterval(refreshTable, 2000) 
}); 

function refreshTable(){ 
    $('#table_list').load('table') 
} 
+0

是的,setInterval是一种更安全的方式来重复地调用某些东西 – Mikkel

0

我会建议你使用jQuery的方法 “完成” 回调 “.load()”

$(document).ready(function(){ 
    refreshTable(); 
}); 

function refreshTable(){ 
    $('#table_list').load('table', function(){ 
     setTimeout(refreshTable, 20000); 
    }); 
} 

因此,setTimeout将在执行查询处理和HTML插入后执行。请注意,我们不再需要“updateTable”辅助函数,因为我们现在递归地调用“refreshTable”函数。