2013-05-11 54 views
0

求解有關如何顯示陣列的數據的問題後每XXX秒與該代碼setIterval funcion:的setInterval不能使用到其他功能

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傳遞。此外,我已將間隔更改爲此以檢測它,但現在它不起作用。顯示在同一時間的所有數據,似乎如果我設置在Chrome調試流應用斷點似乎是正確的忽略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); 
    } 
} 

你知道問題在哪裏嗎?謝謝!

回答

0

setInterval需要函數作爲參數(或函數引用)。但是,您將函數調用的結果傳遞給foo。

你可能要像

var iterations = 0, 
data = [1,2,3,4,5], 
maxIterations = 5, 
interval = setInterval(function() { foo(iterations,data,maxIterations); }, 4000); 

這裏你傳遞一個函數而這又與所有必要的參數調用foo。

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()可能不會更改全局變量的值,因爲您爲本地變量選擇了相同的名稱。