web-dev-qa-db-fra.com

Est-il possible d'appeler une fonction périodiquement en JavaScript?

Est-il possible d'appeler une fonction périodiquement en JavaScript?

115
coderex

Vous voulez setInterval():

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

Le premier paramètre à setInterval () peut également être une chaîne de code à évaluer.

Vous pouvez effacer une fonction périodique avec:

clearInterval(intervalID);
194
zombat

Veuillez noter que setInterval () n'est souvent pas la meilleure solution pour une exécution périodique - Cela vraiment dépend du javascript que vous appelez en fait périodiquement.

par exemple, si vous utilisez setInterval () avec une période de 1000 ms et que, dans la fonction périodique, vous effectuez un appel ajax dont le retour prend parfois 2 secondes, vous passerez un autre appel ajax avant que la première réponse ne soit renvoyée. généralement indésirable.

De nombreuses bibliothèques ont des méthodes périodiques qui protègent contre les pièges de l'utilisation de setInterval de manière naïve, comme dans l'exemple Prototype donné par Nelson.

Pour obtenir une exécution périodique plus robuste avec une fonction contenant un appel jQuery ajax, envisagez quelque chose comme celui-ci:

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);

Une autre approche consiste à utiliser setTimeout mais à suivre le temps écoulé dans une variable, puis à définir le délai d'expiration de chaque appel de manière dynamique pour exécuter une fonction aussi proche que possible de l'intervalle souhaité, mais jamais plus rapidement que vous ne pouvez obtenir les réponses.

35
Matt Coubrough

Tout le monde a déjà une solution setTimeout/setInterval. Je pense qu'il est important de noter que vous pouvez passer des fonctions à setInterval, pas seulement des chaînes. C'est en fait probablement un peu "plus sûr" de passer des fonctions réelles au lieu de chaînes qui seront "évaluées" pour ces fonctions.

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

Ou:

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

Vieille question mais .. J'ai également besoin d'un coureur de tâche périodique et écrit TaskTimer . Ceci est également utile lorsque vous devez exécuter plusieurs tâches à des intervalles différents.

// 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 fonctionne à la fois dans le navigateur et dans le nœud. Voir documentation pour toutes les fonctionnalités.

4
Onur Yıldırım

oui - jetez un oeil à setInterval et setTimeout pour exécuter du code à certains moments. setInterval serait celui à utiliser pour exécuter le code périodiquement.

Voir un démo et répondre ici pour utilisation

3
Russ Cam

Vous voudrez jeter un oeil à setInterval () et setTimeout ().

Voici un article de tutoriel décent .

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

Puisque vous voulez que la fonction soit exécutée périodiquement , utilisez setInterval

1
CMS

La méthode native est bien setInterval()/clearInterval(), mais si vous utilisez déjà la bibliothèque Prototype , vous pouvez tirer parti de PeriodicalExecutor:

new PeriodicalUpdator(myEvent, seconds);

Cela évite les appels qui se chevauchent. De http://www.prototypejs.org/api/periodicalExecuter :

"il vous protège contre plusieurs exécutions parallèles de la fonction de rappel, si l’exécution de cet intervalle prend plus de temps que prévu (il maintient un indicateur interne" en cours de fonctionnement ", qui est protégé contre les exceptions dans la fonction de rappel). Ceci est particulièrement utile si vous utilisez-en un pour interagir avec l'utilisateur à des intervalles donnés (par exemple, utilisez une invite ou un appel de confirmation): vous éviterez ainsi que plusieurs boîtes de message ne soient toutes en attente d'être traitées. "

1
Nelson