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

Richard Knop
fuente

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.

jAndy
fuente
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>
Azulejo
fuente
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.
    }
}
Om Shankar
fuente
¿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>

Creatividad óptima
fuente
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
8
setInterval(fn,time)

es el método que buscas.

Jamiec
fuente
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);
  }
}
John Henckel
fuente
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");
}

Ankit Tiwari
fuente
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
  )
}
srghma
fuente
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)

usuario12449933
fuente
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);
Vijay sadhu
fuente
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.

Gaurav Tripathi
fuente