在特定变量中存储计时器ID时,不会触发setTimeout事件

时间:2013-02-13 20:54:00

标签: javascript settimeout

我在打字的时候找到了这个答案,我以为我还是会发帖子以防万一

我相信没有人能够重现这一点,但是到底是什么。 :)

我们有一个页面在一些用户输入后触发AJAX调用。在一些用户输入之后,我们使用setTimeout稍等一下,以避免在用户完成输入之前调用AJAX方法。没有什么花哨。但每隔一段时间,setTimeout就会拒绝开火。

代码基本上如下所示:

var c = -1;
function userInput(input)
{
    clearTimeout(c);
    c = setTimeout(function(){load(input);}, 100);
}
function load(input)
{
    console.log("load: " + input);
    // ajax stuff.
}

就像我说的,这通常很好。但是当它停止工作时,“问题”似乎是对变量c的赋值。

这是IE调试控制台的一个片段。如果我将setTimeout的结果分配给c,则不会触发任何内容。如果我将结果分配给其他东西,或者根本不分配它,它就可以正常工作。

>> c = setTimeout("load('test');", 100); 
303789 
>> setTimeout(function(){load('test');}, 100); 
311016 
LOG: load: test
>> clearTimeout(c) 
>> c = setTimeout(function(){load('test');}, 100); 
342177 
>> testtesttest = setTimeout(function(){load('test');}, 100); 
346296 
LOG: load: test 

1 个答案:

答案 0 :(得分:0)

页面中的其他内容也决定使用'c'变量来存储计时器ID。其他代码在新的setTimeout有机会触发之前清除它。更改为使用不同的变量(并使其名称在您使用时更具描述性)。