2012-01-01 12 views
2

私は、関数work()を6秒ごとに呼び出せます。私のjQueryのコードは、私がに実行している問題は、それが素早く2回仕事をループし、それが6秒間待つということですsetTimeoutとsetIntervalが機能しない

function looper(){ 
    // do something 
    if (loopcheck) {   
    setInterval(work,6000); 
    } 
    else { 
    console.log('looper stopped'); 
    } 
} 

です。私は同様の結果とsetTimeoutを使用してみました。

遅延が作動する前に2回呼び出される原因となる原因は何ですか?

+2

は完全なjsコードを表示し、ルーパーを呼び出すと表示されます。おそらく、この関数が2回呼び出されている可能性があります – Kokers

+0

コード内で別の作業が呼び出されていないことは確かですか? – kinakuta

答えて

1

setInterval should be avoided。あなたがしたい場合は、繰り返しごとに6秒と呼ばれるように動作し、あなたがこれを停止したい場合は、あなたが保存したい

function loopWork(){ 
    setTimeout(function() { 
     work(); 
     loopWork(); 
    }, 6000); 
} 

その後

function looper(){ 
    // do something 
    if (loopcheck) {   
    loopWork() 
    } 
    else { 
    console.log('looper stopped'); 
    } 
} 

そしてもちろんのではなく、setTimeoutメソッドへの再帰呼び出しを考えますsetTimeoutメソッドへの最後の呼び出しの値、およびてclearTimeout

にそれを渡すその後
var timeoutId; 
timeoutId = setTimeout(function() { 
    work(); 
    loopWork(); 
}, 6000); 

は停止し、それ

clearTimeout(timeoutId); 
+0

もちろん、6秒ごとに関数を実行するわけではなく、関数を実行してから6秒後に次の関数をスケジュールするため、関数の実行に1秒かかる場合は7秒ごとに実行されます。 (もちろん、ほとんどの_sensible_JSコードは実行するのに全秒を要しませんが、まだ...) – nnnnnn

+0

@nnn - それは良い点です、ありがとう –

0

使用古いスタイルののsetTimeout()

 var i=0; 
     function work(){ 
      console.log(i++); 
     } 
     function runner(){ 
      work(); 
      setTimeout(runner, 6000); 
     }    
     runner(); 
0

は、私は自分自身が、私はそれが簡単に従うことを見つけ、次のパターンを好む:

function LoopingFunction() { 
    // do the work 

    setTimeout(arguments.callee, 6000); // call myself again in 6 seconds 
} 

そして、あなたはどんな時にそれを停止することができるようにしたい場合ポイント:

var LoopingFunctionKeepGoing = true; 
function LoopingFunction() { 
    if(!LoopingFunctionKeepGoing) return; 
    // do the work 

    setTimeout(arguments.callee, 6000); // call myself again in 6 seconds 
} 

これで、LoopingFunctionKeepGoingをfalseに設定することでいつでも停止できます。

関連する問題