解决了如何使用带有代码的setIterval函数每隔XXX秒显示一个数组数据的问题:
var iterations = 0,
data = ['a','bbbbbbbb','c'],
interval = setInterval(foo, 4000);
function foo() {
console.log(data[iterations]);
iterations++;
if (iterations >= 4){
clearInterval(interval);
}else if(iterations == 1){
//we want to make time longer in this iteration.
clearInterval(interval);
interval = setInterval(foo, 8000);
}
}
我想清理所有东西并将所有这些封装成一个函数。问题是,当我将全局变量插入函数时,foo表示所有变量都是未知的,因此我将它们作为attrs传递。此外,为了检测它,我已经改变了间隔,但现在它不起作用。同时显示所有数据,似乎忽略了setIterval
runTest();
function runTest(){
var iterations = 0,
data = [1,2,3,4,5],
maxIterations = 5,
interval = setInterval(foo(iterations,data,maxIterations),4000);
}
function foo(iterations,data,maxIterations){
var sentence = data[iterations];
var div = d3.select('div').append('p').text(sentence);
iterations++;
if (iterations >= maxIterations){
clearInterval(this);
}else{
clearInterval(this);
interval = setInterval(foo(iterations,data,maxIterations),4000);
}
}
如果我在Chrome上设置断点,那么调试程序流程应用似乎是正确的。
你知道问题出在哪里吗?谢谢!
答案 0 :(得分:0)
setInterval需要函数作为参数(或函数引用)。但是,您将函数调用的结果传递给foo。
你可能想要像
这样的东西var iterations = 0,
data = [1,2,3,4,5],
maxIterations = 5,
interval = setInterval(function() { foo(iterations,data,maxIterations); }, 4000);
这里传递一个函数,该函数又调用foo并包含所有必要的参数。
答案 1 :(得分:0)
问题是你在函数内第一次声明变量'interval'。该变量不是全局变量,而是本地化为该函数。
如果你首先在所有函数之外声明你想要具有全局变量的所有变量,那么它将起作用。
var iterations, maxIterations, data, interval;
runTest();
function runTest(){
iterations = 0,
data = [1,2,3,4,5],
maxIterations = 5,
interval = setInterval(foo(iterations,data,maxIterations),4000);
}
请注意,函数foo()可能不会更改全局变量的值,因为您为局部变量选择了相同的名称。