Chamando uma função a cada 60 segundos

244

Usando setTimeout()é possível lançar uma função em um determinado momento:

setTimeout(function, 60000);

Mas e se eu gostaria de iniciar a função várias vezes? Toda vez que um intervalo de tempo passa, eu gostaria de executar a função (a cada 60 segundos, digamos).

Richard Knop
fonte

Respostas:

373

Se você não se importa se o código dentro do timerarquivo pode demorar mais que o seu intervalo, use setInterval():

setInterval(function, delay)

Isso aciona a função passada como o primeiro parâmetro repetidamente.

Uma abordagem melhor é usar setTimeoutjunto com uma self-executing anonymousfunção:

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

isso garante que a próxima chamada não seja feita antes da execução do seu código. Eu usei arguments.calleeneste exemplo como referência de função. É uma maneira melhor de atribuir um nome à função e chamar isso de dentro setTimeoutporque arguments.calleeestá obsoleto no ecmascript 5.

jAndy
fonte
6
Não é possível que a próxima chamada seja feita antes que o código termine a execução. O cronômetro é reduzido de forma assíncrona, mas o retorno de chamada deve ser colocado na fila. Isso significa que seu retorno de chamada pode (e provavelmente será) disparado após mais de 60 segundos.
Andy E
14
A diferença é que setInterval geralmente vai executar a função x milissegundos após o início da iteração anterior, ao passo que a abordagem aqui será executado a próxima iteração x milissegundos após o anterior terminou
Gareth
41
Apenas uma observação para outras pessoas que possam achar isso - clearInterval()é uma função de parceiro setInterval()e é útil se você deseja interromper sua chamada de função periódica.
Clay
7
Observe que setInterval executa a função pela primeira vez após o atraso ms. Portanto, se você deseja executar a função imediatamente e ENTÃO repita todo atraso, faça: func (); setInterval (func, atraso);
Marco Marsala
5
Eu simplesmente não entendo esse argumento. Eu tenho a função getRates (), mas (function () {getRates (); setTimeout (getRates (), 10000);}) (); não está funcionando: /
darth0s 8/17
66

use o

setInterval(function, 60000);

EDIT: (Caso você queira parar o relógio depois que ele for iniciado)

Seção de script

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

e código HTML

<!-- Stop Button -->
<a href="#" onclick="window.clearInterval(int);return false;">Stop</a>
Pássaro azul
fonte
1
Nesse caso, como você impediria que ela se repetisse depois que ela começou a se repetir?
Anderson Green
26

Uma melhor utilização dos Jandy 's resposta para implementar uma função de pesquisa que as pesquisas a cada intervalsegundo, e termina após 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);

ATUALIZAR

Conforme o comentário, atualizando-o para a capacidade da função passada para interromper a pesquisa:

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
fonte
Como você interromperia a pesquisa por dentro sendHeartBeat?
temuri
1
Este é um bom exemplo! Quando você usa timers mais difícil para testes de unidade de gravação, mas com esta abordagem - é fácil
Dmytro Medvid
Boa resposta. Você pode atualizar um dos usos da nova Data para que sejam consistentes, um usa (nova Data) .getTime () e outro (nova Data ()). GetTime (). Ambos parecem funcionar ok embora
Mark Adamson
intervale timeoutestão em milissegundos, não estão?
Patrizio Bekerle
18

No jQuery você pode fazer assim.

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>

Criativo ideal
fonte
O número renova mais ou menos a cada 12 segundos - não deve ser um minuto?
Max
1
ver comentário // Change Interval here to test. For eg: 5000 for 5 secAtualmente, está definido para mudar a cada 6 segundos. usar o valor 60000 por um minuto
Optimum criativa
8
setInterval(fn,time)

é o método que você procura.

Jamiec
fonte
7

Você pode simplesmente chamar setTimeout no final da função. Isso o adicionará novamente à fila de eventos. Você pode usar qualquer tipo de lógica para variar os valores de atraso. Por exemplo,

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

Chame uma função Javascript a cada 2 segundos continuamente por 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
fonte
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
fonte
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)

user12449933
fonte
0

aqui consolamos o número natural de 0 a ...... n (o próximo número é impresso no console a cada 60 segundos), usando setInterval ()

var count = 0;
function abc(){
    count ++;
    console.log(count);
}
setInterval(abc,60*1000);
Vijay sadhu
fonte
1
Um pouco de explicação sobre como resolver o problema seria ótimo.
vahdet
-1

Existem 2 maneiras de ligar para

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

  2. setInterval(functionName, 60000);

A função acima será ativada a cada 60 segundos.

Gaurav Tripathi
fonte