Llamar a una función cada 60 segundos


244

Al setTimeout()usarlo es posible iniciar una función a una hora específica:

setTimeout(function, 60000);

Pero, ¿qué pasa 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).

Respuestas:


373

Si no le importa si el código timerpuede tardar más que su intervalo, use setInterval():

setInterval(function, delay)

Eso activa la función pasada como primer parámetro una y otra vez.

Un mejor enfoque es, setTimeoutjunto con una self-executing anonymousfunción:

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

eso garantiza que la próxima llamada no se realice antes de que se ejecute su código. Utilicé arguments.calleeen este ejemplo como referencia de función. Es una mejor manera de asignarle un nombre a la función y llamarlo setTimeoutporque arguments.calleeestá en desuso en ecmascript 5.


66
No es posible realizar la siguiente llamada antes de que el código termine de ejecutarse. El temporizador realiza una cuenta regresiva asíncrona, pero la devolución de llamada debe estar en cola. Esto significa que su devolución de llamada puede (y probablemente lo hará) después de más de 60 segundos.
Andy E

14
La diferencia es que setInterval general se ejecutará la función x milisegundos después del comienzo de la iteración anterior, mientras que el enfoque que aquí se ejecutará los milisegundos siguiente iteración x después de la anterior terminó
Gareth

41
Solo como una nota para otros que puedan encontrar esto, clearInterval()es una función asociada setInterval()y es útil si desea suspender su llamada de función periódica.
Clay

77
Tenga en cuenta que setInterval ejecuta la función por primera vez después del retraso ms. Entonces, si desea ejecutar la función de inmediato, y ENTONCES repetir cada retraso, debe hacer: func (); setInterval (func, delay);
Marco Marsala

55
Simplemente no entiendo estos argumentos. Tengo la función getRates () pero (function () {getRates (); setTimeout (getRates (), 10000);}) (); no funciona: /
darth0s

66

utilizar el

setInterval(function, 60000);

EDITAR: (en caso de que quiera detener el reloj después de que se inicie)

Sección de secuencia de comandos

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

y código HTML

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

1
En ese caso, ¿cómo evitarías que se repita después de haber comenzado a repetirse?
Anderson Green

26

Un mejor uso de Jandy 's respuesta a implementar una función de sondeo que las encuestas cada intervalsegundo, y finalizará después de timeoutsegundos.

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

ACTUALIZAR

Según el comentario, actualizándolo para que la función pasada pueda detener el sondeo:

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.
    }
}

¿Cómo detenerías el sondeo desde dentro sendHeartBeat?
temuri

1
Este es un buen ejemplo! Cuando usa temporizadores, es más difícil escribir pruebas unitarias, pero con este enfoque, es fácil
Dmytro Medvid el

Buena respuesta. ¿Podría actualizar uno de los usos de la nueva Fecha para que sean consistentes, uno usa (nueva Fecha) .getTime () y el otro (nueva Fecha ()). GetTime (). Sin embargo
Mark Adamson

intervaly timeoutestán en milisegundos, ¿no?
Patrizio Bekerle

18

En jQuery puedes hacer así.

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>


El número se renueva más o menos cada 12 segundos. ¿No debería ser este un minuto?
Max

1
ver comentario // Change Interval here to test. For eg: 5000 for 5 secActualmente está configurado para cambiar cada 6 segundos. use el valor 60000 por un minuto
Optimum Creative


7

Simplemente puede 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 retraso. Por ejemplo,

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


3

Llame a una función Javascript cada 2 segundos de forma continua durante 10 segundos.

var intervalPromise;
$scope.startTimer = function(fn, delay, timeoutTime) {
    intervalPromise = $interval(function() {
        fn();
        var currentTime = new Date().getTime() - $scope.startTime;
        if (currentTime > timeoutTime){
            $interval.cancel(intervalPromise);
          }                  
    }, delay);
};

$scope.startTimer(hello, 2000, 10000);

hello(){
  console.log("hello");
}


1
// example:
// checkEach(1000, () => {
//   if(!canIDoWorkNow()) {
//     return true // try again after 1 second
//   }
//
//   doWork()
// })
export function checkEach(milliseconds, fn) {
  const timer = setInterval(
    () => {
      try {
        const retry = fn()

        if (retry !== true) {
          clearInterval(timer)
        }
      } catch (e) {
        clearInterval(timer)

        throw e
      }
    },
    milliseconds
  )
}

1

function random(number) {
  return Math.floor(Math.random() * (number+1));
}
setInterval(() => {
    const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';//rgb value (0-255,0-255,0-255)
    document.body.style.backgroundColor = rndCol;   
}, 1000);
<script src="test.js"></script>
it changes background color in every 1 second (written as 1000 in JS)


0

aquí consolamos el número natural 0 a ...... n (el siguiente número se imprime en la consola cada 60 segundos), usando setInterval ()

var count = 0;
function abc(){
    count ++;
    console.log(count);
}
setInterval(abc,60*1000);

1
Un poco de explicación sobre cómo resuelve el problema sería genial.
vahdet

-1

Hay 2 formas de llamar

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

  2. setInterval(functionName, 60000);

la función anterior se activará cada 60 segundos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.