2010-06-29 20 views
164

Usando setTimeout() es posible poner en marcha una función en un momento determinado:Llamar a una función cada 60 segundos

setTimeout(function, 60000); 

Pero lo que si me gustaría iniciar la función varias veces? Cada vez que pasa un intervalo de tiempo, me gustaría ejecutar la función (cada 60 segundos, digamos).

Respuesta

279

Si no le importa si el código dentro de la timer puede tomar más tiempo que el intervalo, utilice setInterval():

setInterval(function, delay) 

que dispara la función pasada como primer parámetro una y otra vez.

Un mejor enfoque es, para usar setTimeout junto con una función self-executing anonymous:

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

que garantiza, que la próxima llamada no se hizo antes de que se ejecuta el código. Usé arguments.callee en este ejemplo como referencia de función. Es una mejor manera de dar un nombre a la función y llamarla dentro de setTimeout porque arguments.callee está en desuso en ecmascript 5.

+4

No es posible hacer la próxima llamada antes de que el código termine de ejecutarse. El temporizador realiza una cuenta regresiva de forma asíncrona, pero la devolución de llamada debe ponerse en cola. Esto significa que su devolución de llamada puede (y probablemente lo hará) disparar después de más de 60 segundos. –

+12

La diferencia es que setInterval generalmente ejecutará la función x milisegundos después del ** inicio ** de la iteración anterior, mientras que el enfoque aquí se ejecutará la siguiente iteración x milisegundos después de la anterior ** finalizó ** – Gareth

+1

@Andy E's head , @Gareth: Gareth tiene razón, ese enfoque simplemente evita que el código de bucle se ejecute mientras otro bloque de código aún se está ejecutando. – jAndy

51

utilice el EDITAR

setInterval(function, 60000); 

: (En caso de que si desea detener el reloj después de que se inicia)

sección de escritura

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

y el código HTML

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

En ese caso, ¿cómo evitar que se vuelva a repetir después de que hubiera comenzado a repetir? –

+0

es simple. Actualizaré la respuesta para eso. – BlueBird

5
setInterval(fn,time) 

es el método que está buscando.

14

Un mejor uso de jAndy 's answer de implementar una función de sondeo que urnas cada interval segundos, y termina después timeout segundos.

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

ACTUALIZACIÓN

Según el comentario, actualizándolo para la capacidad de la función pasada para detener la interrogación:

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

¿Cómo se detendrá el sondeo desde 'sendHeartBeat '? – temuri

+1

@temuri, respuesta actualizada –

+1

¡Este es un buen ejemplo! Cuando utiliza temporizadores es más difícil escribir pruebas unitarias, pero con este enfoque, es fácil –

5

sólo tiene que llamar a setTimeout al final de la función. Esto lo agregará nuevamente a la cola de eventos. Puede usar cualquier tipo de lógica para variar los valores de retardo.Por ejemplo,

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

Hay 2 maneras de llamada-

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

  2. setInterval(functionName, 60000);

por encima de la función que invoque cada 60 segundos.

5

En jQuery puedes hacer esto.

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

El número se renueva más o menos cada 12 segundos, ¿no debería ser un minuto? – Max

+1

ver comentario '// Cambiar intervalo aquí para probar. Por ejemplo, 5000 durante 5 segundos. Actualmente está configurado para cambiar cada 6 segundos. use el valor 60000 por un minuto –

Cuestiones relacionadas