Gibt es eine Möglichkeit, eine Funktion in JavaScript regelmäßig aufzurufen?


Antworten:


214

Sie wollen setInterval():

var intervalID = setInterval(function(){alert("Interval reached");}, 5000);

Der erste Parameter für setInterval () kann auch eine auszuwertende Codezeichenfolge sein.

Sie können eine periodische Funktion löschen mit:

clearInterval(intervalID);

15
Ich habe upvoted und dann beschlossen, meine upvote (aber nicht downvote) zu widerrufen, weil Sie ein String-Argument verwenden, um setInterval zu setzen. Funktionen sollten fast immer zugunsten eines Zeichenfolgenarguments verwendet werden, um Effizienz, Sicherheit und deren Abschlussfunktionen zu gewährleisten.
Jason S

5
Das ist in Ordnung, es macht mir nichts aus. setInterval()ist die richtige Antwort auf die Frage, unabhängig vom Parameter. Es ist nur ein Beispiel und beide Methoden sind per Definition korrekt.
Zombat

2
Ich stimme Jason S zu; es sollte wirklich eine Funktion sein. In Ihrem Beispiel ist das einzige Problem ein vernachlässigbarer Leistungsverlust, aber es ist eine schlechte Angewohnheit, sich darauf einzulassen.
Matthew Crumley

4
Ich stimme Ihnen beiden zu, eine Funktion zu verwenden ist besser. Ich habe nie gesagt, dass es nicht so ist. Es ist so oder so richtig, aber um der Kommentare willen werde ich die Antwort so bearbeiten, dass sie stattdessen eine Funktion enthält.
Zombat

37

Bitte beachten Sie, dass setInterval () häufig nicht die beste Lösung für die regelmäßige Ausführung ist. Dies hängt wirklich davon ab, welches Javascript Sie tatsächlich regelmäßig aufrufen.

z.B. Wenn Sie setInterval () mit einem Zeitraum von 1000 ms verwenden und in der periodischen Funktion einen Ajax-Aufruf tätigen, dessen Rückkehr gelegentlich 2 Sekunden dauert, führen Sie einen weiteren Ajax-Aufruf durch, bevor die erste Antwort zurückkommt. Dies ist normalerweise unerwünscht.

Viele Bibliotheken verfügen über periodische Methoden, die vor den Gefahren einer naiven Verwendung von setInterval schützen, wie beispielsweise das von Nelson gegebene Prototyp-Beispiel.

Beachten Sie Folgendes, um eine robustere periodische Ausführung mit einer Funktion zu erreichen, die einen jQuery-Ajax-Aufruf enthält:

function myPeriodicMethod() {
  $.ajax({
    url: ..., 
    success: function(data) {
      ...
    },
    complete: function() {
      // schedule the next request *only* when the current one is complete:
      setTimeout(myPeriodicMethod, 1000);
    }
  });
}

// schedule the first invocation:
setTimeout(myPeriodicMethod, 1000);

Ein anderer Ansatz besteht darin, setTimeout zu verwenden, aber die verstrichene Zeit in einer Variablen zu verfolgen und dann die Zeitüberschreitungsverzögerung bei jedem Aufruf dynamisch festzulegen, um eine Funktion so nahe wie möglich am gewünschten Intervall auszuführen, jedoch niemals schneller, als Sie Antworten zurückerhalten können.


setTimeout (myPeriodicMethod, 1000); wird 2 mal aufgerufen. ist es erforderlich? Ich denke, festgelegte Auszeit sollte nur in der vollständigen Funktion aufgerufen werden
Vishnudev K

1
Ja, das zweite setTimeout () ist keine Voraussetzung. Sie können einfach myPeriodicMethod () aufrufen, das den ersten Ajax-Aufruf sofort ausführt. Wenn Sie ihn jedoch mit einer Verzögerung vom ersten Aufruf an planen möchten, können Sie ihn als schreiben Ich habe geschrieben.
Matt Coubrough

16

Jeder hat bereits eine setTimeout / setInterval-Lösung. Ich denke, es ist wichtig zu beachten, dass Sie Funktionen an setInterval übergeben können, nicht nur Zeichenfolgen. Es ist wahrscheinlich ein wenig "sicherer", echte Funktionen anstelle von Zeichenfolgen zu übergeben, die für diese Funktionen "ausgewertet" werden.

// example 1
function test() {
  alert('called');
}
var interval = setInterval(test, 10000);

Oder:

// example 2
var counter = 0;
var interval = setInterval(function() { alert("#"+counter++); }, 5000);

3
+1 Wenn Sie ein Schüler der Crockford-Schule für JavaScript sind , vermeiden Sie die Bewertung in all ihren bösen Formen.
Patrick McElhaney

@Patrick - Ich glaube nicht, dass der Vorschlag "Verwenden Sie nicht $ (Dollarzeichen) oder \ (Backslash) in Namen" gut zum jQuery-Los passt :)
Russ Cam

6

Alte Frage aber .. Ich brauchte auch einen periodischen Task Runner und schrieb TaskTimer . Dies ist auch nützlich, wenn Sie mehrere Aufgaben in unterschiedlichen Intervallen ausführen müssen.

// Timer with 1000ms (1 second) base interval resolution.
var timer = new TaskTimer(1000)

// Add task(s) based on tick intervals.
timer.addTask({
    name: 'job1',       // unique name of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (set to 0 for unlimited times)
    callback: function (task) {
        // code to be executed on each run
        console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
    }
});

// Start the timer
timer.start();

TaskTimerfunktioniert sowohl im Browser als auch im Node. In der Dokumentation finden Sie alle Funktionen.




2
function test() {
 alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
   clearInterval(id);
}


1

Der native Weg ist zwar setInterval()/ clearInterval(), aber wenn Sie bereits die Prototype- Bibliothek verwenden, können Sie PeriodicalExecutor nutzen:

new PeriodicalUpdator(myEvent, seconds);

Dies verhindert überlappende Anrufe. Von http://www.prototypejs.org/api/periodicalExecuter :

"Es schützt Sie vor mehreren parallelen Ausführungen der Rückruffunktion, sollte die Ausführung länger als das angegebene Intervall dauern (es behält ein internes" laufendes "Flag bei, das gegen Ausnahmen in der Rückruffunktion geschützt ist). Dies ist besonders nützlich, wenn Sie Verwenden Sie eine, um in bestimmten Intervallen mit dem Benutzer zu interagieren (z. B. eine Eingabeaufforderung verwenden oder einen Anruf bestätigen): Dadurch werden mehrere Meldungsfelder vermieden, die alle darauf warten, bearbeitet zu werden. "

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.