2016-12-03 12 views
0

JavascriptでsetIntervalメソッドとclearIntervalメソッドを試していますが、問題が発生しています。私がしようとしているのは、ほとんどの時間 ""秒ごとに名目上呼び出される関数ですが、特定の間隔ではより頻繁に実行されます。私はこれまでコンセプトの証明である何かの不完全な裸の骨であるコードを閉じ込めました - この例では、10分ごとに分が表示されます。そうでなければ30〜40分(ダミーの値を使って動作させることができるかどうかを確認する)、ディスプレイは1秒ごとに更新されます。しかし、私は、setIntervalがまだ動作しているかどうか、また再起動する方法( "myVar"変数)を確認することができないことに気付きました。Javascriptを変更するsetInterval

<!DOCTYPE html> 
<html> 
<body> 

<p id="demo">Just testing...</p> 

<script> 

var d = new Date(); 

myVar = setInterval(informUser, 10000); 

function informUser() 
{ 

if (d.getMinutes()>30 && d.getMinutes()<40) // every second 
{ 
    clearInterval(myVar); 
    mvVar = setInterval(informUser, 1000); 
    document.getElementById("demo").innerHTML = d.getMinutes();  
} 
else // else 10 seconds 
{ 
    document.getElementById("demo").innerHTML = d.getMinutes();  
} 

} 

</script> 

</body> 
</html> 

私がレンガの壁に突き当たったときのコードは非常に不完全です。一度作業したら、もう少し複雑にすることができます。 EDIT:

構文に関するご意見ありがとうございましたが、ここでは問題はありません。 現時点でコードが実行していることは、時間の31分に達するまで10分ごとに画面に分を出力します。その後、タイマーを停止し、1秒間隔でタイマーを開始します。 9分後に、タイマーが開始されていないためコードが停止します。

myVarがnullであるかどうかを確認するには、 "else // else 10 seconds"セクションにあります。そうであれば、10秒間隔でタイマーを再起動します。

+0

'setInterval'関数の最初のパラメータは、関数への**参照**である必要があります(その呼び出しが別の関数への参照を返さない限り、関数の呼び出しではありません)。あなたは 'setInterval(informUser、X)'を使用するべきです – Dekel

+0

ありがとう、私は上にそれを変更します(できる場合) – user3713442

+0

あなたは変更することができますが、あなたの質問への答えです。あなた自身のコードでそれを更新し、チェックしてください。あなたの問題を解決するはずです。 – Dekel

答えて

1

Dateオブジェクトは、関数の外で作成されているので、一定のまま。

ブロックの長さは、elseブロックでは更新されません。

各モードでインターバルタイマーを再作成すると、ドリフトによって奇妙な影響が生じることがあります。むしろ、両方の必要な間隔の最大公約数であるタイムアウトを持つ1つのタイマーを作成し、そのトリガーをカウントし、そのカウントにロジックを基づいてください。

interval = setInterval(informUser, 1000); 
intervalCount = 0; 

function informUser() { 
    var minutes = Date.now().getMinutes(); 
    intervalCount++; 

    if(minutes > 30 && minutes < 40) { 
     intervalCount = 0; 
     document.getElementById("demo").innerHTML = minutes; 
    } 
    else if (intervalCount >= 10) { 
     intervalCount = 0; 
     document.getElementById("demo").innerHTML = minutes; 
    } 

} 
0

あなたの質問は不明です。

"setIntervalがまだ実行中かどうかを確認する"基本的には、常に実行されています。停止する唯一の時間はclearIntervalであり、その後もう一度起動します。

同様に、myVarは決してnullにはなりません。

そして、31から39の期間では、実際には「間隔」を使用していません。あなたはそれをクリアして毎回再起動します。

どのようにこの件について:

var d = new Date(); 

currInterval = 10000; 
myVar = setInterval(informUser, currInterval); 

function informUser() 
{ 
    document.getElementById("demo").innerHTML = d.getMinutes();  

    intervalShouldBe = 10000; 

    if (d.getMinutes()>30 && d.getMinutes()<40) 
     intervalShouldBe = 1000; 

    // stop and restart only when interval needs to change 
    if(currInterval != intervalShouldBe) { 

     clearInterval(myVar); 
     myVar = null; 
     myVar = setInterval(informUser, intervalShouldBe); 
     currInterval = intervalShouldBe; 
    } 
} 
関連する問題