SetTimeout的奇怪行为

时间:2017-09-29 12:36:39

标签: javascript html

我试图每隔20秒用JavaScript刷新一个div。这是我的代码:

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

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

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

页面准备好后,我就可以开始倒计时了。但是这段代码每隔3秒更新一次表。有人能帮我吗?我做错了什么?

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

5 个答案:

答案 0 :(得分:2)

你有无限的递归:

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

你应该使用setIinterval而不是使你的setTimeout循环。

答案 1 :(得分:2)

文档准备就绪后,请致电updateTable

20秒后,它会调用refreshTable立即再次调用updateTable。因此,它会排队另一个refreshTable,然后再次点击updateTable 。这使它成为一个无限循环...或至少进入堆栈溢出。

您需要:

  • updateTable内拨打refreshTable,而不是updateTable
  • setInterval处理程序中使用ready,而不是使用setTimeout

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

这可能会帮助你,至少我希望如此:D

答案 4 :(得分:0)

我建议你使用"完成"回调jQuery方法" .load()"

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

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

因此,在执行查询处理和HTML插入之后将执行setTimeout。请注意,我们不需要" updateTable"辅助功能,我们现在称之为" refreshTable"函数递归。