2016-05-25 20 views
0

severals setInterval関数を「すぐに」起動しようとしています。 私はforIntervalを含むインデックス付き関数を呼び出すforループを持っています。私はタブとTAB2、両方チェックしましたjavascript setInterval関数の内部ループが機能しない

... setInterval with loop time

しかし、私はまだ成功して苦労している:ここ JavaScript closure inside loops – simple practical example と:

私はここで答えの両方のために見てきました私はここに

のsetInterval関数の外にconsole.logでそれらを読めば働くことは私のコードです:

var tab = <?php echo json_encode($matrice); ?>; 
var tab2 = new Array(); 

var funcs = []; 

var countDownAction = new Array(); 

function countDown(i) 
{ 
    countDownAction[i] = setInterval(function(i) 
    { 
     // some actions 

    }, 1000); 
} 


for(var i = 0; i < tab.length; i++) 
{ 
    tab2[i] = []; 

    tab2[i]['hours'] = tab[i]['hours']; 
    tab2[i]['minutes'] = tab[i]['minutes']; 
    tab2[i]['seconds'] = tab[i]['seconds']; 

    funcs[i] = countDown.bind(this, i); 
} 

for(var j = 0; j < tab.length; j++) 
{ 
    funcs[j](); 
} 
+1

あなたの '//some actions'は変数' i'に依存していますか? – Luka

+0

はい、これらのアクションは変数iに依存します –

+0

'setinterval'にパラメータ' i'を渡していますが、 'setInterval'はそのコールバックにパラメータを渡さないので、' i'は未定義です。 –

答えて

2

setInterval内の関数が引数なしで呼び出されます。したがって、関数本体内のiは未定義です。

は次のようにcountDown機能書き換え検討:

function countDown(i) 
{ 
    countDownAction[i] = setInterval(function() 
    { 
     // some actions 

    }, 1000); 
} 

このように、機能の本体は、外側のスコープでiへのアクセスを有します。

では、次の操作を行うことができ、3.5秒後に言って、タイマーをクリアするには:

setTimeout(function() { 
    for (var k = 0; k < tab.length; k++) { 
     clearInterval(countDownAction[k]); 
    } 
}, 3500); 
+0

それはうまくいくようです –

+0

愚かな音がするかもしれませんが、setInterval関数と同じ方法でこれらの倍数setIntervalをクリアすることはできません... –

+1

タイマーをクリアします。 –

0

私はあなたの代わりに、以下試すことができ、あなたがcountDownActionのためのグローバル変数を使用することを推奨します。

window.countDownAction = window.countDownAction || []; 
関連する問題