Чи є можливість періодично викликати функцію в JavaScript?


Відповіді:


214

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

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

Перший параметр setInterval () також може бути рядком коду, який слід оцінити.

Ви можете очистити періодичну функцію за допомогою:

clearInterval(intervalID);

15
Я прийняв пропозицію, а потім вирішив скасувати своє оновлення (але не знищення), оскільки ви використовуєте аргумент рядка для setInterval. Функції майже завжди повинні використовуватися на користь аргументу рядків, для ефективності, безпеки та для функцій їх закриття.
Jason S

5
Це добре, я не проти. setInterval()це правильна відповідь на питання, незалежно від параметра. Це лише приклад, і обидва методи за визначенням правильні.
zombat

2
Я згоден з Джейсоном S; це дійсно має бути функцією. У вашому прикладі єдина проблема - це незначна втрата продуктивності, але це погана звичка потрапляти.
Меттью Крамлі

4
Я погоджуюся з обома, краще використовувати функцію. Я ніколи не говорив, що це не так. Це так чи інакше, але заради коментарів я відредагую відповідь, щоб замість неї містити функцію.
zombat

37

Зауважте, що setInterval () часто не є найкращим рішенням для періодичного виконання - Це дійсно залежить від того, який JavaScript ви насправді періодично дзвоните.

напр. Якщо ви використовуєте setInterval () з періодом 1000 мс і в періодичній функції ви здійснюєте ajax-дзвінок, який час від часу займає 2 секунди, щоб повернутися, ви будете робити ще один ajax-дзвінок, перш ніж повернеться перша відповідь. Зазвичай це небажано.

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


setTimeout (myPeriodicMethod, 1000); називається 2 рази. це потрібно? Думаю, встановити тайм-аут слід лише в повному обсязі
Вишнудев K

1
Так, другий setTimeout () не є вимогою, ви можете просто зателефонувати на myPeriodicMethod (), який би виконував перший дзвінок ajax негайно ... але якщо ви хочете запланувати його із затримкою від першого виклику, ви можете записати його як Я написав.
Метт Coubrough

16

У кожного вже є рішення 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
+1 Якщо ви студент школи Crockford JavaScript , ви уникаєте евалу у всіх його злих формах.
Патрік МакЕлхані

@Patrick - Я не думаю, що пропозиція "Не використовуйте $ (знак долара) або \ (зворотній косий рисок) в іменах" буде добре знижуватися з лотом jQuery :)
Russ Cam

6

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




2
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

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


1

Народний спосіб справді setInterval()/ clearInterval(), але якщо ви вже використовуєте бібліотеку прототипів, ви можете скористатися PeriodicalExecutor:

new PeriodicalUpdator(myEvent, seconds);

Це запобігає перекриття дзвінків. Від http://www.prototypejs.org/api/periodicalExecuter :

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.