2010-06-29 6 views
164

En utilisant setTimeout() il est possible de lancer une fonction à un moment précis:Appel d'une fonction toutes les 60 secondes

setTimeout(function, 60000); 

Mais si je voudrais lancer la fonction plusieurs fois? Chaque fois qu'un intervalle de temps passe, je voudrais exécuter la fonction (toutes les 60 secondes, disons).

Répondre

279

Si vous ne vous inquiétez pas si le code dans le timer peut prendre plus longtemps que votre intervalle, utilisez setInterval():

setInterval(function, delay) 

qui déclenche la fonction passée en tant que premier paramètre à plusieurs reprises.

Une meilleure approche est, d'utiliser setTimeout avec une fonction self-executing anonymous:

(function(){ 
    // do some stuff 
    setTimeout(arguments.callee, 60000); 
})(); 

qui garantit que le prochain appel ne se fait pas avant que votre code a été exécuté. J'ai utilisé arguments.callee dans cet exemple comme référence de fonction. C'est un meilleur moyen de donner un nom à la fonction et de l'appeler au setTimeout car arguments.callee est obsolète dans ecmascript 5.

+4

Il n'est pas possible que l'appel suivant soit effectué avant que le code ne soit terminé. La minuterie compte de manière asynchrone, mais le rappel doit être mis en file d'attente. Cela signifie que votre callback peut (et probablement se déclenchera) après plus de 60 secondes. –

+12

La différence est que setInterval exécute généralement la fonction x millisecondes après le ** début ** de l'itération précédente, alors que l'approche ici exécute l'itération suivante x millisecondes après la précédente ** terminée ** – Gareth

+1

@Andy E tête , @Gareth: Gareth a raison, cette approche évite juste que le code de boucle soit exécuté alors qu'un autre codeblock est toujours en cours d'exécution. – jAndy

51

utiliser le

setInterval(function, 60000); 

EDIT: (Dans le cas si vous voulez arrêter l'horloge après son démarrage)

section Script

<script> 
var int=self.setInterval(function, 60000); 
</script> 

et code HTML

<!-- Stop Button --> 
<a href="#" onclick="window.clearInterval(int);return false;">Stop</a> 
+0

Dans ce cas, comment voulez-vous empêcher de répéter après avoir commencé à répéter? –

+0

c'est simple. Je vais mettre à jour la réponse pour cela. – BlueBird

5
setInterval(fn,time) 

est la méthode que vous recherchez.

14

Une meilleure utilisation de l » answerjAndy pour mettre en œuvre une fonction de vote que les sondages tous les interval secondes, et se termine après timeout secondes.

function pollFunc(fn, timeout, interval) { 
    var startTime = (new Date()).getTime(); 
    interval = interval || 1000; 

    (function p() { 
     fn(); 
     if (((new Date).getTime() - startTime) <= timeout) { 
      setTimeout(p, interval); 
     } 
    })(); 
} 

pollFunc(sendHeartBeat, 60000, 1000); 

MISE À JOUR

Selon le commentaire, la mise à jour pour la capacité de la fonction passée pour arrêter le vote:

function pollFunc(fn, timeout, interval) { 
    var startTime = (new Date()).getTime(); 
    interval = interval || 1000, 
    canPoll = true; 

    (function p() { 
     canPoll = ((new Date).getTime() - startTime) <= timeout; 
     if (!fn() && canPoll) { // ensures the function exucutes 
      setTimeout(p, interval); 
     } 
    })(); 
} 

pollFunc(sendHeartBeat, 60000, 1000); 

function sendHeartBeat(params) { 
    ... 
    ... 
    if (receivedData) { 
     // no need to execute further 
     return true; // or false, change the IIFE inside condition accordingly. 
    } 
} 
+0

Comment arrêter l'interrogation depuis 'sendHeartBeat'? – temuri

+1

@temuri, mise à jour la réponse –

+1

Ceci est un bon exemple! Lorsque vous utilisez des minuteurs, il est plus difficile d'écrire des tests unitaires, mais avec cette approche, c'est facile –

5

Vous pouvez simplement appeler setTimeout à la fin de la fonction. Cela l'ajoutera à la file d'attente d'événements. Vous pouvez utiliser n'importe quel type de logique pour faire varier les valeurs de délai.Par exemple,

function multiStep() { 
    // do some work here 
    blah_blah_whatever(); 
    var newtime = 60000; 
    if (!requestStop) { 
    setTimeout(multiStep, newtime); 
    } 
} 
0

Il y a 2 façons de Call-

  1. setInterval(function(){ functionName();}, 60000);

  2. setInterval(functionName, 60000);

fonction ci-dessus fera appel à toutes les 60 secondes.

5

En jQuery, vous pouvez faire comme ça.

function random_no(){ 
 
    var ran=Math.random(); 
 
    jQuery('#random_no_container').html(ran); 
 
} 
 
      
 
window.setInterval(function(){ 
 
     /// call your function here 
 
     random_no(); 
 
}, 6000); // Change Interval here to test. For eg: 5000 for 5 sec
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="random_no_container"> 
 
     Hello. Here you can see random numbers after every 6 sec 
 
</div>

+0

Le nombre renouvelle plus ou moins toutes les 12 secondes - ne devrait-il pas être une minute? – Max

+1

voir le commentaire '// Change Interval here to test. Par exemple: 5000 pour 5 sec' Actuellement, il est configuré pour changer toutes les 6 secondes. utiliser la valeur 60000 pour une minute –

Questions connexes