Web Development

Ein Lehrbuch für das Informatik oder Medien-Informatik Studium.

Wie kann man in Javascript mit der Zeit arbeiten? Eine Uhr bauen? Die Zeit stoppen?

Dafür lernen wir nun zwei Methoden kennen.

setTimeout

Die Metode setTimeout gehört zum window Objekt im Browser.

Mit dieser Methode kann man einen Funktionsaufruf “in die Zukunft” schicken:

function later () {
  console.log("this will happen in 1 second.");
}
setTimeout(later, 1000);

Das erste Argument ist eine Funktion, die in der Zukunft aufgerufen werden soll. Das zweite Argument gibt die Zeit in Millisekunden an.

mit Arrow Function

Man kann die Funktion auch als Arrow-Function schreiben:

setTimeout(() => {
  console.log("this will happen in 1 second.");
}, 1000);

Das ist synchron

Mit der setTimout Methode lernen wir die erste asynchrone Methode kennen.

Bei allen anderen Funktionen war es immer so, dass erst nachdem die Methode ihre Arbeit beendet hat der nächste Befehl ausgeführt wird:

function now () {
  console.log("2");
}
console.log("1");
now();
console.log("3");

Deswegen ist der Output hier 1, 2, 3.

Das ist asynchron

Da setTimout asynchron arbeitet, ist die Reihenfolge hier anders:

function later () {
  console.log("2? will happen in 1 second.");
}
console.log("1");
setTimeout(later, 1000);
console.log("3");

Der Output ist 1, 3. Und sehr viel später dann: 2? will happen in 1 second.

timeout abbestellen

Wenn man den timer nicht mehr braucht, kann man ihn mit clearTimeout wieder löschen:

function later () {
  console.log("will happen in 1 second.");
}
let t = setTimeout(later, 1000);
clearTimeout(t);

Hier wird es nie zu dem Output kommen.

Intervall

Mit der Methode setInterval können wir eine Funktion wiederholt aufrufen lassen:

function again () {
  console.log("another second is over.");
}
setInterval(again, 1000);

interval abbestellen

Genau wie bei setTimeout und clearTimeout gibt es zu setInterval ein clearInterval:

let counter = 0;
let i;
function again () {
  counter++;
  console.log(counter, " seconds");
  if (counter > 10) clearInterval(i);
}
i = setInterval(again, 1000);

Vertiefung: Asynchron

Bei der Vorstellung der asynchronen Funktionen haben wir gelernt: Ein laufendes Javascript-Programm wird niemals unterbrochen. Erst wenn das aktuelle Programm beendet ist wird eine Callback-Funktion aufgerufen.

Diese Prinzip kann man am Beispiel von setTimeout besonders gut sehen.

setTimeout mit drei Sekunden

Mit setTimeout kann man eine Funktion später (Angabe in Millisekunden) ausführen lassen:

Javascript Code asynchron

function later() {
  console.log("3 Sekunden später", Date.now());
}
console.log("tick", Date.now());
setTimeout(later, 3000);
console.log("tock", Date.now());
console.log("tick", Date.now());
console.log("tock", Date.now());

(Programm in die Konsole kopieren und ausprobieren!)

setTimeout mit null Sekunden

Was passiert, wenn man den Timeout auf 0 setzt?

Javascript Code asynchron

function later() {
  console.log("0 Sekunden später?", Date.now());
}
console.log("tick", Date.now());
setTimeout(later, 0);
console.log("tock", Date.now());
console.log("tick", Date.now());
console.log("tock", Date.now());

Zwei Ergebnisse wären möglich:

Variante A: passiert sofort
tick
0 Sekunden später?
tock
tick
tock

Variante B: Programm läuft durch bis zum Ende
tick
tock
tick
tock
0 Sekunden später?

Auflösung setTimeout mit null Sekunden

Die Antwort ist: das Javascript-Programm wird nicht unterbrochen, sonder läuft bis zum Ende durch. Hier nochmal mit mehr Ausgaben:

Javascript Code asynchron

function later() {
  console.log("NICHT 0 Sekunden später!", Date.now());
}
console.log("tick", Date.now());
setTimeout(later, 0);
console.log("tock", Date.now());
console.log("tick", Date.now());
console.log("tock", Date.now());
// Output in der Konsole:
// tick 1588059630667
// tock 1588059630668
// tick 1588059630668
// tock 1588059630668
// nicht 0 Sekunden später 1588059630669

Ähnliche Befehle

Es gibt drei Befehle in diesem Bereich: