2011-06-24 14 views
0

私はたくさんのループをあらかじめ作成する必要があるページを作成しようとしています。 while/forループを使用すると、ループが完了するまでページが停止し、この場合ループが数時間実行される可能性があります。私もsetTimeoutを使用しようとしましたが、再帰の限界に達します。ページが再帰制限に達しないようにするにはどうすればよいですか?中にJavaScriptループを作成しないでください

var looper = { 
    characters: 'abcdefghijklmnopqrstuvwxyz', 
    current: [0], 
    target: '', 
    max: 25, 
    setHash: function(hash) { 
    this.target = hash; 
    this.max = this.characters.length; 
    }, 
    getString: function() { 
    string = ''; 
    for (letter in this.current) { 
     string += this.characters[this.current[letter]]; 
    } 
    return string; 
    }, 
    hash: function() { 
    return Sha1.hash(this.getString()); 
    }, 
    increment: function() { 
    this.current[0] += 1; 
    if (this.current[0] > this.max) { 
     if (this.current.length == 1) { 
     this.current = [0, 0]; 
     } else { 
     this.current[1] += 1; 
     this.current[0] = 0; 
     } 
    } 
    if (this.current[1] > this.max) { 
     if (this.current.length == 2) { 
     this.current[2] == 0; 
     } else { 
     this.current[3] += 1; 
     this.current[2] = 0; 
     } 
    } 
    }, 

    loop: function() { 
    if (this.hash() == this.target) { 
     alert(this.getString()); 
    } else { 
     this.increment(); 
     setTimeout(this.loop(), 1); 
    } 
    } 
} 
+0

なぜこのような処理をクライアント側で行っていますか? –

+0

@Karl Knechtel - Think Distributed – AJ00200

答えて

3

setIntervalは通常の方法ですが、setIntervalよりもコードのリファクタリングが簡単ですが、HTML5ブラウザでのみ動作するWebワーカーを試すこともできます。

http://dev.w3.org/html5/workers/

+0

はい、私は実験コードで以前にWebワーカーを使用していましたが、後でこのプロジェクトで使用することができます。しかし、今はクロスブラウザである必要があります。アドバイスをいただきありがとうございます。 – AJ00200

1

setIntervalが機能する場合があります。これは、ミリ秒単位で関数を呼び出します。例

あなたの関数(MyFunctionを)5秒ごとに呼び出します
myInterval = setInterval(myFunction,5000); 

については

1

setIntervalを使用するループチェッカーはありません。

var loopWorking = false; 
function looper(){ 
    loopWorking = true; 
    //Do stuff 
    loopWorking = false; 
} 
function checkLooper() 
{ 
    if(loopWorking == false) 
     looper(); 
} 
setInterval(checkLooper, 100); //every 100ms or lower. Can reduce down to 1ms 
0

あなたは再帰を避けたい場合は、this.loop()の内側からthis.loop()を呼び出すことはありません。その代わりに、window.setInterval()を使用して繰り返しループを呼び出します。

0

私はGoogleのコード飾り立てるでスタイルを渡し継続し、コードに手に持っていました。

は基本的に私は、再帰関数呼び出しが存在しないため、任意の再帰制限に達していない

var i = 0, n = arr.length; 
function work() { 
    var t0 = +new Date; 
    while (i < n) { 
    processItem(i); 
    ++i; 
    if (new Date - t0 > 100) { 
     setTimeout(work, 250); 
     return; 
    } 
    } 
    done(); 
} 
work(); 

for (var i = 0, n = arr.length; i < n; ++i) { 
    processItem(i); 
} 
done(); 

を回しました。

2

setTimeoutは、あなたが思っていることをしていません。ここでは、それはやっているものです:

  1. それはこの文を検出:

    setTimeout(this.loop(), 1); 
    
  2. それはsetTimeoutthis.loop()への最初の引数を評価します。そこにはloopがあります。おそらく予想通り、1ミリ秒待たないでください。理論的には

    setTimeout(undefined, 1); 
    

、とにかく:

  • それはこのようにsetTimeoutメソッドを呼び出します。実際には、2番目のステップは完了しません。それは無限に繰り返されます。

    setTimeout(this.loop, 1); 
    

    はしかし、その後、thisは、次のループでwindow、ないlooper次のようになります。何をする必要がある機能ではなく、関数の戻り値への参照を渡しています。代わりにバインドしてください:

    setTimeout(this.loop.bind(this), 1); 
    
  • 関連する問題