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

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

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

4b9b3361

Ответ 1

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

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

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

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

clearInterval(intervalID);

Ответ 2

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

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

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

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

Ответ 3

У всех уже есть решение 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);

Ответ 4

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Нативный способ действительно setInterval()/clearInterval(), но если вы уже используете библиотеку Prototype, вы можете взять преимущество Периодического исполнителя:

new PeriodicalUpdator(myEvent, seconds);

Это предотвращает перекрывающиеся вызовы. Из http://www.prototypejs.org/api/periodicalExecuter:

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

Ответ 9

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