2011-07-22 6 views
0

コード行を配列に保持していて、setTimeout()でセルをセルごとに実行しようとしています。ループ内のevalとsetTimeout

for (i=0; i<restorePoints.length; i++){ 
    eval(restorePoints[i]); 
} 

が、私はすべての反復の間に短い遅延時間を持つようにしたい:

これはうまくコードを実行し、私が代わりにevalの)のsetTimeoutを(使用したいです()。

for (i=0; i<restorePoints.length; i++){ 
    setTimeout(restorePoints[i],1000); 
} 

または

for (i=0; i<restorePoints.length; i++){ 
    setTimeout(eval(restorePoints[i]),1000); 
} 

私はそれをどのようにしないでください。これらの作品のどれもが、何らかの理由で? おかげ

答えて

2

ループが高速です。すべてのタイムアウトが連続して作成されるため、すべてのタイムアウトが同時に発生します。あなたは時間が反復ごとに時間を増大させるループ変数、すなわちに依存させる、または、私はどうなるのか、一つだけタイムアウトと再帰呼び出しを使用することができ、次のいずれか

(function() { 
    var data = restorePoints; 
    var run = function(i) { 
     setTimeout(function() { 
      var entry = data[i]; 
      if(entry) { 
       eval(entry); 
       run(i+1); 
      } 
     }, 1000); 
    }; 
    run(0); 
}()); 

注意があることを離れ遅延からeval(string)setTimeout(string, ...)差:setTimeout(及びsetInterval)は、グローバルスコープでそれを評価する一方

evalは、現在のスコープのパラメータを評価します。

これはあなたに関連する可能性があります。

+0

それは働いている! –

2

あなたはそれにそれらのいずれかの方法をやろうとしている、あなたは無名関数に関数呼び出しをラップする必要があります場合:それ以外の場合は

for (i=0; i<restorePoints.length; i++){ 
    setTimeout(function(){eval(restorePoints[i]}),1000); 
} 

あなたが発射するためにevalを設定していませんタイムアウトでは、実行中のJavascriptコード(この場合は何でもよい)の結果を、setTimeoutが嫌うものに設定しています。

+0

これは、すべてのタイムアウトを同時に発生させます。関数を 'setTimeout'に渡すことは、文字列も同様に評価されるので必要ありません(' setTimeout(eval(restorePoints [i])、1000); 'が間違っています)。 –

+0

良い点。私は質問のその部分を逃した。ありがとうございます。 –