2017-05-12 47 views
0

我是JavaScript新手,我無法正確使用setInterval()函數。在循環js中調用多個setInterval()函數

基本上我想調用一個函數在不同的給定的時間間隔爲我有兩個列表中的不同參數。

我有一個叫myfunction的函數。我有一個名爲myparam的列表,其中包含我想要傳遞此函數的所有變量。最後,我有一個名爲myfrequency的列表,這是我希望每次調用myfunction和myparam中給定的參數之間的毫秒時間。我正在嘗試類似這樣的東西,但它不起作用:

for(i=0;i<myparam.length();i++;){ 
    setInterval(function(){myfunction(myparam[i]);},myfrequency[i]); 
    } 

上述代碼的結果是它僅適用於最後一個索引。 myfunction會以正確的參數在正確的時間間隔被調用,僅用於myparam中的最後一個值。

爲什麼會發生這種情況?我認爲setInterval()以不正確的間隔調用函數嗎?

+1

http://stackoverflow.com/questions/2728278/what-is-a-practical-use-for-a-closure-in-javascript閱讀的答案,其中一個顯示您的具體問題 –

+0

非常普遍的問題。發生什麼事情是,當你的setInterval觸發時,循環已經完成,所以'i'指向最後一個元素 – david

+0

@david確實增加了延遲修復?我嘗試每次調用setTimeout()都會添加一個延遲setInterval,但現在它根本不工作。 – Saxman13

回答

0

那麼這是因爲setInterval的具有延遲時的時間間隔運行 的循環已經結束

要做到這一點剛剛創建另一個函數,然後將啓動間隔

function StartInterval(index, frequency) { 
    setInterval(function(){ 
     myfunction(index); 
    },frequency); 
} 

內,這意味着你的循環只是調用這個函數,並通過一些

for(i=0;i<myparam.length;i++){ 
    StartInterval(myparam[i], myfrequency[i]) 
} 


 
/** set what value you want **/ 
 
var myparam = [10,20,30]; 
 
var myfrequency = [1000,2000,3000]; 
 

 

 
function myfunction(index) { 
 
    console.log(index); 
 
} 
 

 
function StartInterval(index, frequency) { 
 
    setInterval(function(){ 
 
    myfunction(index); 
 
    },frequency); 
 
} 
 

 
for(i=0;i<myparam.length;i++){ 
 
    StartInterval(myparam[i], myfrequency[i]) 
 
}

+0

達赫 - 只是打敗了我!還要注意 - 原始的JavaScript有一些語法問題。 myparam.length是一個屬性,而不是一個函數(假設myparam是一個數組),並且不需要for循環(i ++;)的最後一個分號。 這是一個問題的原因處理所謂的「封閉」。由於var i處於調用「myfunction」的範圍內,到Interval計時器到期時,i的值實際上超出了myparam數組的末尾,所以我很驚訝它會報告任何有意義的內容。它應該發送「未定義」到我的功能。 – pacifier21

+0

非常感謝! @Beginner我只是把你說的話寫入我的代碼中,它現在完美無瑕! – Saxman13

+0

@ pacifier21是的,我知道我的語法在原文中很糟糕,我試圖簡化實際的代碼,並且改變了一些東西 – Saxman13