Chiamare una funzione ogni 60 secondi


245

Usandolo setTimeout()è possibile avviare una funzione in un momento specifico:

setTimeout(function, 60000);

E se volessi avviare la funzione più volte? Ogni volta che passa un intervallo di tempo, vorrei eseguire la funzione (ogni 60 secondi, diciamo).

Risposte:


374

Se non ti interessa se il codice all'interno di timerpotrebbe richiedere più tempo del tuo intervallo, utilizza setInterval():

setInterval(function, delay)

Ciò attiva ripetutamente la funzione passata come primo parametro.

Un approccio migliore è, da usare setTimeoutinsieme a una self-executing anonymousfunzione:

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

ciò garantisce che la chiamata successiva non viene effettuata prima dell'esecuzione del codice. Ho usato arguments.calleein questo esempio come riferimento di funzione. È un modo migliore per assegnare un nome alla funzione e chiamarlo all'interno setTimeoutperché arguments.calleeè deprecato in ecmascript 5.


6
Non è possibile effettuare la chiamata successiva prima che il codice termini l'esecuzione. Il timer esegue il conto alla rovescia in modo asincrono ma il callback deve essere messo in coda. Ciò significa che il callback potrebbe (e probabilmente verrà) attivato dopo più di 60 secondi.
Andy E

14
La differenza è che setInterval generalmente esegue la funzione x millisecondi dopo l' inizio della iterazione precedente, mentre l'approccio qui eseguirà i millisecondi successiva iterazione x dopo il precedente concluso
Gareth

41
Proprio come una nota per gli altri che potrebbero trovarlo - clearInterval()è una funzione del partner setInterval()ed è utile se si desidera interrompere la chiamata di funzione periodica.
Clay,

7
Si noti che setInterval esegue la funzione per la prima volta dopo il ritardo ms. Quindi, se si desidera eseguire immediatamente la funzione e quindi ripetere ogni ritardo, è necessario eseguire: func (); setInterval (func, delay);
Marco Marsala,

5
Non capisco proprio questo argomento. Ho la funzione getRates () ma (function () {getRates (); setTimeout (getRates (), 10000);}) (); non funziona: /
darth0s

66

utilizzare il

setInterval(function, 60000);

EDIT: (Nel caso in cui si desideri fermare l'orologio dopo che è stato avviato)

Sezione script

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

e codice HTML

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

1
In tal caso, come si impedirebbe che si ripeta dopo che ha iniziato a ripetere?
Anderson Green,

26

Un migliore utilizzo dei JANDY 's risposta per implementare una funzione di polling che i sondaggi ogni intervalsecondi, e termina dopo timeoutpochi secondi.

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

AGGIORNARE

Come da commento, aggiornandolo per consentire alla funzione passata di interrompere il polling:

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

Come fermeresti il ​​polling dall'interno sendHeartBeat?
temuri,

1
Questo è un buon esempio! Quando usi i timer è più difficile scrivere test unitari, ma con questo approccio - è facile
Dmytro Medvid

Buona risposta. Per favore, potresti aggiornare uno degli usi della nuova data in modo che siano coerenti, uno usa (nuova data) .getTime () e l'altro (nuova data ()). GetTime (). Entrambi sembrano funzionare bene però
Mark Adamson

intervale timeoutsono in millisecondi, vero?
Patrizio Bekerle,

18

In jQuery puoi fare così.

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>


Il numero si rinnova più o meno ogni 12 secondi - non dovrebbe essere un minuto?
Max

1
vedi commento // Change Interval here to test. For eg: 5000 for 5 secAttualmente è impostato per cambiare ogni 6 secondi. utilizza il valore 60000 per un minuto
Creatività ottimale

8
setInterval(fn,time)

è il metodo che stai cercando.


7

Puoi semplicemente chiamare setTimeout alla fine della funzione. Questo lo aggiungerà di nuovo alla coda degli eventi. È possibile utilizzare qualsiasi tipo di logica per variare i valori di ritardo. Per esempio,

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


3

Chiamare una funzione Javascript ogni 2 secondi ininterrottamente per 10 secondi.

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

qui consolliamo il numero naturale da 0 a ...... n (il prossimo numero viene stampato nella console ogni 60 sec.), usando setInterval ()

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

1
Un po 'di spiegazioni su come risolve il problema sarebbe fantastico.
vahdet

-1

Ci sono 2 modi per chiamare

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

  2. setInterval(functionName, 60000);

la funzione sopra richiamerà ogni 60 secondi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.