Aufruf einer Funktion alle 60 Sekunden

244

Mit setTimeout()dieser Funktion kann eine Funktion zu einem bestimmten Zeitpunkt gestartet werden:

setTimeout(function, 60000);

Was aber, wenn ich die Funktion mehrmals starten möchte? Jedes Mal, wenn ein Zeitintervall vergeht, möchte ich die Funktion ausführen (sagen wir alle 60 Sekunden).

Richard Knop
quelle

Antworten:

373

Wenn es Ihnen egal ist, ob der Code innerhalb von timermöglicherweise länger als Ihr Intervall dauert, verwenden Sie setInterval():

setInterval(function, delay)

Dadurch wird die als erster Parameter übergebene Funktion immer wieder ausgelöst.

Ein besserer Ansatz ist, setTimeoutzusammen mit einer self-executing anonymousFunktion zu verwenden:

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

Dies garantiert, dass der nächste Aufruf nicht erfolgt, bevor Ihr Code ausgeführt wurde. Ich habe arguments.calleein diesem Beispiel als Funktionsreferenz verwendet. Es ist eine bessere Möglichkeit, der Funktion einen Namen zu geben und diese innerhalb aufzurufen, setTimeoutda arguments.calleesie in Ecmascript 5 veraltet ist.

jAndy
quelle
6
Es ist nicht möglich, den nächsten Aufruf zu tätigen, bevor der Code ausgeführt wurde. Der Timer zählt asynchron herunter, aber der Rückruf muss in die Warteschlange gestellt werden. Dies bedeutet, dass Ihr Rückruf nach mehr als 60 Sekunden ausgelöst werden kann (und wahrscheinlich auch wird).
Andy E
14
Der Unterschied besteht darin, dass setInterval im Allgemeinen die Funktion x Millisekunden nach dem Start der vorherigen Iteration ausführt , während der Ansatz hier die nächste Iteration x Millisekunden nach dem Ende
Gareth
41
Nur als Hinweis für andere, die dies möglicherweise finden - clearInterval()ist eine Partnerfunktion setInterval()und nützlich, wenn Sie Ihren regelmäßigen Funktionsaufruf beenden möchten.
Clay
7
Bitte beachten Sie, dass setInterval die Funktion zum ersten Mal nach Verzögerung ms ausführt. Wenn Sie also die Funktion sofort ausführen und dann jede Verzögerung wiederholen möchten, sollten Sie Folgendes tun: func (); setInterval (func, delay);
Marco Marsala
5
Ich verstehe diese Argumente einfach nicht. Ich habe die Funktion getRates (), aber (function () {getRates (); setTimeout (getRates (), 10000);}) (); funktioniert nicht: /
darth0s
66

benutze die

setInterval(function, 60000);

BEARBEITEN: (Falls Sie die Uhr nach dem Start stoppen möchten)

Skriptabschnitt

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

und HTML-Code

<!-- Stop Button -->
<a href="#" onclick="window.clearInterval(int);return false;">Stop</a>
BlueBird
quelle
1
Wie würden Sie in diesem Fall verhindern, dass es sich wiederholt, nachdem es sich wiederholt hat?
Anderson Green
26

Eine bessere Verwendung der Antwort von jAndy zur Implementierung einer Abfragefunktion , die alle Sekunden abfragt und nach Sekunden endet .intervaltimeout

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

AKTUALISIEREN

Aktualisieren Sie den Kommentar gemäß dem Kommentar, damit die übergebene Funktion die Abfrage stoppen kann:

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
quelle
Wie würden Sie die Abstimmung von innen stoppen sendHeartBeat?
Temuri
1
Das ist ein gutes Beispiel! Wenn Sie Timer verwenden, ist es schwieriger,
Komponententests
Gute Antwort. Könnten Sie bitte eine der Verwendungen des neuen Datums so aktualisieren, dass sie konsistent sind? Eine verwendet (neues Datum) .getTime () und die andere (neues Datum ()). GetTime (). Beide scheinen aber in Ordnung zu funktionieren
Mark Adamson
intervalund timeoutsind in Millisekunden, nicht wahr?
Patrizio Bekerle
18

In jQuery können Sie dies tun.

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>

Optimale Kreativität
quelle
Die Nummer erneuert sich mehr oder weniger alle 12 Sekunden - sollte dies nicht eine Minute sein?
Max
1
siehe Kommentar // Change Interval here to test. For eg: 5000 for 5 secDerzeit wird die Einstellung alle 6 Sekunden festgelegt. Verwenden Sie den Wert 60000 für eine Minute
Optimum Creative
8
setInterval(fn,time)

ist die Methode, nach der Sie suchen.

Jamiec
quelle
7

Sie können setTimeout einfach am Ende der Funktion aufrufen. Dadurch wird es erneut zur Ereigniswarteschlange hinzugefügt. Sie können jede Art von Logik verwenden, um die Verzögerungswerte zu variieren. Beispielsweise,

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

Rufen Sie 10 Sekunden lang alle 2 Sekunden eine Javascript-Funktion auf.

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
quelle
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
quelle
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
quelle
0

hier trösten wir die natürliche Zahl 0 bis ...... n (nächste Zahl wird alle 60 Sekunden in der Konsole gedruckt), wobei setInterval () verwendet wird.

var count = 0;
function abc(){
    count ++;
    console.log(count);
}
setInterval(abc,60*1000);
Vijay sadhu
quelle
1
Eine kleine Erklärung, wie das Problem gelöst wird, wäre großartig.
Vahdet
-1

Es gibt zwei Möglichkeiten anzurufen:

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

  2. setInterval(functionName, 60000);

Die obige Funktion wird alle 60 Sekunden aufgerufen.

Gaurav Tripathi
quelle