2017-05-12 12 views
0

javascriptが新しく、setInterval()関数を正しく使用するのに問題があります。jsのループで複数のsetInterval()関数を呼び出す

基本的には、リストにあるさまざまなパラメータに対して、それぞれ異なる間隔で関数を呼び出す必要があります。

私はmyfunctionと呼ばれる機能を持っています。私はこの関数を渡したいすべての変数を持つmyparamというリストを持っています。最後に、myfrequencyというリストがあります。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はこれを修正する遅延を追加しますか? setIntervalが呼び出されるたびにsetTimeout()で遅延を追加しようとしましたが、現在は全く動作しません。 – 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タイマーが時間切れになるまでには、実際にはmyparam配列の終わりを超えているので、何か意味があると報告するのは驚きです。それはmyfunctionに "undefined"を送るべきです。 – pacifier21

+0

ありがとう! @Beginnerあなたが言ったことを自分のコードに取り入れただけで、今は完璧に動作します! – Saxman13

+0

@ pacifier21はい、私の構文は元々ひどいものでした。私は実際のコードを単純化しようとしていましたが、いくつか変更しました – Saxman13

関連する問題