web-dev-qa-db-ja.com

JavaScriptで定期的に関数を呼び出す方法はありますか?

JavaScriptで定期的に関数を呼び出す方法はありますか?

115
coderex

setInterval()が必要です:

var intervalID = setInterval(function(){alert("Interval reached");}, 5000);

setInterval() の最初のパラメーターは、評価するコードの文字列にすることもできます。

周期関数は次の方法でクリアできます。

clearInterval(intervalID);
194
zombat

多くの場合、setInterval()は定期的な実行に最適なソリューションではないことに注意してください。実際は、実際に定期的に呼び出すJavaScriptによって異なります。

たとえば、1000msの周期でsetInterval()を使用し、周期関数で、戻りに2秒かかることがあるajax呼び出しを行う場合、最初の応答が返される前に別のajax呼び出しを行います。通常は望ましくありません。

多くのライブラリには、Nelsonが提供するPrototypeの例のように、setIntervalを単純に使用する落とし穴を防ぐ定期的な方法があります。

JQuery ajax呼び出しを含む関数を使用して、より堅牢な定期実行を実現するには、次のようなものを検討してください。

function myPeriodicMethod() {
  $.ajax({
    url: ..., 
    success: function(data) {
      ...
    },
    complete: function() {
      // schedule the next request *only* when the current one is complete:
      setTimeout(myPeriodicMethod, 1000);
    }
  });
}

// schedule the first invocation:
setTimeout(myPeriodicMethod, 1000);

別のアプローチは、setTimeoutを使用しますが、変数で経過時間を追跡し、各呼び出しのタイムアウト遅延を動的に設定して、可能な限り望ましい間隔に近い関数を実行しますが、応答を得るよりも速くなることはありません。

35
Matt Coubrough

誰もが既にsetTimeout/setIntervalソリューションを持っています。文字列だけでなく、関数をsetIntervalに渡すことができることに注意することが重要だと思います。実際には、それらの関数に「評価」される文字列ではなく、実際の関数を渡す方が少し「安全」です。

// example 1
function test() {
  alert('called');
}
var interval = setInterval(test, 10000);

または:

// example 2
var counter = 0;
var interval = setInterval(function() { alert("#"+counter++); }, 5000);
15
gnarf

古い質問ですが..定期的なタスクランナーも必要で、 TaskTimer と書きました。これは、異なる間隔で複数のタスクを実行する必要がある場合にも役立ちます。

// Timer with 1000ms (1 second) base interval resolution.
var timer = new TaskTimer(1000)

// Add task(s) based on tick intervals.
timer.addTask({
    name: 'job1',       // unique name of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (set to 0 for unlimited times)
    callback: function (task) {
        // code to be executed on each run
        console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
    }
});

// Start the timer
timer.start();

TaskTimerはブラウザとNodeの両方で機能します。すべての機能については documentation をご覧ください。

4

はい-特定の時間にコードを実行するための setIntervalおよびsetTimeout を見てください。 setIntervalは、コードを定期的に実行するために使用するものです。

デモと回答はこちら を使用してください

3
Russ Cam

SetInterval()およびsetTimeout()を確認する必要があります。

まともなチュートリアル記事 です。

3
Matthew Vines
function test() {
 alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
   clearInterval(id);
}
2
Ben Lesh

関数を定期的に実行するため、 setInterval を使用します

1
CMS

ネイティブの方法は確かにsetInterval()/clearInterval()ですが、すでに Prototype ライブラリを使用している場合は、PeriodicalExecutorを利用できます。

new PeriodicalUpdator(myEvent, seconds);

これにより、呼び出しの重複が防止されます。 http://www.prototypejs.org/api/periodicalExecuter から:

「コールバック関数の複数の並列実行から保護します。実行に所定の間隔より時間がかかる場合(コールバック関数の例外から保護される内部「実行」フラグを維持します)。これは特に便利です。指定された間隔でユーザーと対話するために1つを使用します(たとえば、プロンプトまたは確認呼び出しを使用します)。これにより、複数のメッセージボックスがすべてアクションされるのを待機しなくなります。

1
Nelson