174 votes

Existe-t-il un moyen d'appeler une fonction périodiquement en JavaScript ?

Existe-t-il un moyen d'appeler une fonction périodiquement en JavaScript ?

265voto

zombat Points 46702

El setInterval() appelle de manière répétée une fonction ou exécute un extrait de code, avec un délai fixe entre chaque appel. Elle renvoie un ID d'intervalle qui identifie de manière unique l'intervalle, de sorte que vous pouvez le supprimer ultérieurement en appelant clearInterval().

var intervalId = setInterval(function() {
  alert("Interval reached every 5s")
}, 5000);

// You can clear a periodic function by uncommenting:
// clearInterval(intervalId);

Voir plus @ setInterval() @ MDN Web Docs

15 votes

J'ai voté en haut puis j'ai décidé d'annuler mon vote en haut (mais pas mon vote en bas) parce que vous utilisez un argument chaîne pour setInterval. Les fonctions devraient presque toujours être utilisées en faveur d'un argument de type chaîne, pour des raisons d'efficacité, de sécurité et pour leurs fonctionnalités de fermeture.

5 votes

C'est bon, ça ne me dérange pas. setInterval() est la réponse correcte à la question, quel que soit le paramètre. Il ne s'agit que d'un exemple, et les deux méthodes sont par définition correctes.

2 votes

Je suis d'accord avec Jason S ; cela devrait vraiment être une fonction. Dans votre exemple, le seul problème est une perte de performance négligeable, mais c'est une mauvaise habitude à prendre.

54voto

Matt Coubrough Points 888

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

ex. Si vous utilisez setInterval() avec une période de 1000ms et que dans la fonction périodique vous faites un appel ajax qui prend parfois 2 secondes pour revenir, vous ferez un autre appel ajax avant que la première réponse ne revienne. Cela n'est généralement pas souhaitable.

De nombreuses bibliothèques ont des méthodes périodiques qui protègent contre les pièges de l'utilisation naïve de setInterval, comme 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 ceci :

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 dynamiquement le délai d'attente à chaque invocation afin d'exécuter une fonction aussi près que possible de l'intervalle souhaité, mais jamais plus vite que les réponses que vous pouvez obtenir en retour.

1 votes

SetTimeout(myPeriodicMethod, 1000) ; est appelé 2 fois. est-ce nécessaire ? Je pense que set time out doit être appelé uniquement dans la fonction complète.

1 votes

Oui, le deuxième setTimeout() n'est pas une obligation, vous pourriez simplement appeler myPeriodicMethod() qui effectuerait le premier appel ajax immédiatement... mais si vous voulez le programmer avec un délai dès le premier appel, vous pourriez l'écrire comme je l'ai écrit.

18voto

gnarf Points 49213

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 de caractères. En fait, il est probablement un peu plus "sûr" de passer des fonctions réelles plutôt que des chaînes de caractères qui seront "évaluées" dans 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);

3 votes

+1 Si vous êtes un étudiant de la École Crockford de JavaScript vous évitez l'évaluation sous toutes ses formes.

0 votes

@Patrick - Je ne pense pas que la suggestion "N'utilisez pas $ (signe dollar) ou \ (backslash) dans les noms" sera bien accueillie par le lot jQuery :)

3voto

Russ Cam Points 58168

Oui - jetez un coup d'œil à setInterval y setTimeout pour exécuter du code à certains moments. setInterval serait celui à utiliser pour exécuter du code périodiquement.

Voir un démo et réponse ici pour l'usage

3voto

Matthew Vines Points 14425

Vous voudrez jeter un coup d'œil à setInterval() et setTimeout().

Voici un article tutorial décent .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X