Есть ли способ периодически вызывать функцию в JavaScript? - PullRequest
113 голосов
/ 04 августа 2009

Есть ли способ периодически вызывать функцию в JavaScript?

Ответы [ 9 ]

191 голосов
/ 04 августа 2009

Вы хотите setInterval():

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

Первый параметр setInterval () также может быть строкой кода для оценки.

Вы можете очистить периодическую функцию с помощью:

clearInterval(intervalID);
34 голосов
/ 21 мая 2014

Обратите внимание, что setInterval () часто не является лучшим решением для периодического выполнения - оно действительно зависит от того, какой javascript вы на самом деле периодически вызываете.

например. Если вы используете setInterval () с периодом 1000 мс и в периодической функции вы делаете ajax-вызов, для возврата которого иногда требуется 2 секунды, вы будете делать еще один ajax-вызов до того, как первый ответ вернется. Это обычно нежелательно.

У многих библиотек есть периодические методы, которые защищают от ловушек наивного использования setInterval, например, пример Prototype, приведенный Нельсоном.

Чтобы добиться более надежного периодического выполнения с функцией, в которой есть вызов 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, но отслеживать истекшее время в переменной, а затем динамически устанавливать задержку времени ожидания для каждого вызова для выполнения функции как можно ближе к желаемому интервалу, но никогда не быстрее, чем вы можете получить ответы обратно.

15 голосов
/ 04 августа 2009

У всех уже есть решение 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);
3 голосов
/ 23 августа 2016

Старый вопрос, но .. Мне также нужен был периодический бегун задач и я написал 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. См. документацию для всех функций.

3 голосов
/ 04 августа 2009

Вы захотите взглянуть на setInterval () и setTimeout ().

Вот достойный учебник .

3 голосов
/ 04 августа 2009

да - посмотрите на setInterval и setTimeout для выполнения кода в определенное время. setInterval будет использоваться для периодического выполнения кода.

См. Демоверсию и ответ здесь для использования

2 голосов
/ 04 августа 2009
function test() {
 alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
   clearInterval(id);
}
1 голос
/ 04 августа 2009

Родной путь действительно setInterval() / clearInterval(), но если вы уже используете библиотеку Prototype , вы можете воспользоваться PeriodicalExecutor:

new PeriodicalUpdator(myEvent, seconds);

Это предотвращает дублирование вызовов. От http://www.prototypejs.org/api/periodicalExecuter:

"он защищает вас от многократного параллельного выполнения функции обратного вызова, если для его выполнения требуется больше времени, чем заданный интервал (он поддерживает внутренний« рабочий »флаг, который экранируется от исключений в функции обратного вызова). полезно, если вы используете один для взаимодействия с пользователем через определенные промежутки времени (например, используйте подсказку или подтверждающий вызов): это позволит избежать нескольких окон сообщений, ожидающих действий. "

1 голос
/ 04 августа 2009

Поскольку вы хотите, чтобы функция выполнялась периодически , используйте setInterval

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...