2017-03-28 18 views
1

私はある範囲の秒の間にランダムな間隔で自己を繰り返す関数が必要でした。ランダムな間隔でsettimeout関数を停止して開始する

私はこれが私に必要なものを見つけました。私が今抱えているjavascript setinterval with random time

function myFunction() { 
    var min = 5, 
    max = 10; 

    //Generate Random number between 5 - 10 
    var rand = Math.floor(Math.random() * (max - min + 1) + min); 
    alert('Wait for ' + rand + ' seconds'); 
    setTimeout(myFunction, rand * 1000); 
} 

myFunction() 

問題は、停止/それを開始するには、この機能に分割する方法ですか?

+0

タイムアウトをクリアしますか – CognitiveDesire

+1

myFunction()はsetTimeout()によって返されたtimeoutIdを返し、次にwindow.clearTimeout(timeoutId)を使用します。 [参考](https://developer.mozilla.org/de/docs/Web/API/WindowTimers/setTimeout) –

+0

これは再帰呼び出しであり、実行ループから復帰するためにリターンを使用するまで停止しません。 –

答えて

0

が、これはあなたがあなたのランダムな呼び出しを停止するには、setTimeoutによって返されたトークンを渡し、clearTimeoutを使用することができますあなたの

var handle; 
function start() { 
    var min = 5, 
    max = 10; 
    var rand = Math.floor(Math.random() * (max - min + 1) + min); 
    handle = setTimeout(myFunction, rand * 1000); 
} 

function stop() { 
    clearTimeout(handle); 
} 

function myFunction() { 
    //Your code 
} 
0

を助けるように。以下の例の実装では

は、私は2つの機能play(min, max)pauseを命名しました。

var token 
 

 
function play (min, max) { 
 
    action() 
 
    token = setTimeout(
 
    play, Math.floor(Math.random()*(max - min) + min), 
 
    min, max 
 
) 
 
} 
 

 
function pause() { 
 
    clearTimeout(token) 
 
} 
 

 
function action() { 
 
    console.log('Example function') 
 
} 
 

 

 
play(500, 5000) 
 

 
// Pause after one minute 
 
setTimeout(pause, 60000)

+0

答えにセミコロンを残さないでください。 ASIは非常にエラーを起こしやすいです。 – Barmar

1

あなたがそれにclearTimeout()を呼び出すことができるように、プロパティにsetTimeoutの結果を保存したオブジェクトにそれをカプセル化します。タイマーのグローバル変数との答えとは異なり

function RandomTimeout(min, max, callback) { 
 
    this.min = min; 
 
    this.max = max; 
 
    this.callback = callback; 
 
    var self = this; 
 
    function repeat() { 
 
    var rand = Math.floor(Math.random() * (max - min + 1) + min); 
 
    console.log('Wait for ' + rand + ' seconds'); 
 
    self.timer = setTimeout(function() { 
 
     callback(); 
 
     repeat(); 
 
    }, rand * 1000); 
 
    } 
 
    this.clear = function() { 
 
    console.log("Stopping"); 
 
    clearTimeout(this.timer); 
 
    } 
 
    // Start the initial iteration 
 
    repeat(); 
 
} 
 

 
var randTimer = new RandomTimeout(2, 5, function() { 
 
    console.log("Beep"); 
 
}); 
 

 
// Stop it in 15 seconds 
 
setTimeout(function() { 
 
    randTimer.clear(); 
 
}, 15000);

、これはあなたが実行している複数のランダムタイマーを持つことができます。

0

私は、コマンドでその中に何かがありますかどうかを確認するために、メッセージの内容を見て、サーバーへのテキストメッセージを使用していました。

if(msg.indexOf('addbot') > -1){ 
     addBotToOnlineListTimer = true; 
     addBotToOnlineList(); 
     return; 
     } 

    if(msg.indexOf('stopaddbot') > -1){ 
     addBotToOnlineListTimer = false;    
     return; 
     } 


function addBotToOnlineList() { 
if (addBotToOnlineListTimer == true) { 
var min = 5, 
max = 10; 
var rand = Math.floor(Math.random() * (max - min + 1) + min); //Generate 
Random number between 5 - 10 
alert('Wait for ' + rand + ' seconds'); 
setTimeout(myFunction, rand * 1000); 
}else{ 
return; 
} 
} 

最初に表示されているように、常に真と評価されます。

ご迷惑をおかけして申し訳ありません。 ;)

関連する問題