Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are – by definition – not smart enough to debug it.
—Brian Kernighan

Polling

Meer info over de setTimeout en setInterval methodes vind je op https://javascript.info/settimeout-setinterval

setTimeout

Basiscode

De functie setTimeout stelt je in staat om een functie uit te voeren na een bepaalde tijd. De functie setTimeout heeft normaal gezien (minstens) twee argumenten: de functie die je wil uitvoeren en het aantal milliseconden dat je wil wachten.

Het volgend voorbeeld toont hoe je een waarschuwingsvenster (‘alert’) in de browser toont drie seconden na het openen van de pagina.

function verwelkom() {
  alert('Welkom bij de les javaScript!');
}

// wacht 3000 msec (3 s) en voer dan de functie verwelkom uit
setTimeout(verwelkom, 3000);

Extra argumenten in setTimeout

Na de wachttijd in msec kan je extra argumenten meegeven. Zo kan volgende functie gebruikt worden om de boodschap in het waarschuwingsvenster met een parameter aan te passen. De uitvoer in het waarschuwingsvenster is ‘Welkom bij de les frontend basis!’.

function verwelkom(les) { 
  alert(`Welkom bij de les ${les}!`);
}

setTimeout(verwelkom, 3000, 'frontend basis');

Alternatief met anonieme callbackfunctie

Het voorbeeld hierboven kan ook geschreven worden met een anonieme callbackfunctie . Vermoedelijk wordt deze methode zelfs meer gebruikt dan met extra parameters in de setTimeout functie zoals hierboven getoond.

function verwelkom(les) {
  alert(`Welkom bij de les ${les}!`);
}

setTimeout(() => {
  verwelkom('JavaScript');
}, 3000);

Asynchroon programmeren

De functie setTimeout is asynchroon. Bekijken we even volgend voorbeeld:

function hallo() {
  console.log('Tweede');
}
  
console.log('Eerste');
setTimeout(hallo, 1000);
console.log('Derde');

De console geeft volgende uitvoer:

Eerste
Derde
Tweede

De functie hallo wordt pas uitgevoerd na 1000 ms. De uitvoer van de console.log('Derde') gebeurt dus voor de uitvoer van de functie hallo.

Dit is een voorbeeld van wat we ‘asynchroon programmeren’ noemen. De functie setTimeout is een asynchrone functie. JS overloopt normaal gezien de regels van een script van boven naar onder. Maar asynchrone functies worden eerst in een aparte wachtrij gezet en pas na de rest uitgevoerd.

Wat als we het uitstel (‘delay’) gelijk stellen aan 0 ms? Denk even goed na wat de console zal tonen als resultaat van volgende code die enkel als aanpassing de tijd van 1000 ms terugbrengt naar 0 ms:
function hallo() {
  console.log('Tweede');
}
  
console.log('Eerste');
setTimeout(hallo, 0); // uitstel van 0 ms
console.log('Derde');

Het resultaat blijft hetzelfde! Ondanks het uistel van 0 ms (dus geen uitstel!) blijft deze methode asynchroon en komt ze dus op in een aparte wachtrij terecht . Deze wachtrij wordt pas na de andere console.log() methodes bekeken.

setInterval

De methode setInterval heeft dezelfde syntaxis als setTimeout, maar voert de functie die het eerste argument is om de zoveel ms uit als in het tweede argument aangegeven wordt.

We maken volgend voorbeeld. Om de 4 seconden wordt er 1 opgeteld bij een startgetal en wordt het resultaat in de console getoond.

let getal = 5; //const zou hier niet werken, waarom niet?
function verhoogEnToon() {
  getal++;
  console.log(getal);
}

setInterval(verhoogEnToon, 4000);

De console toont na 4 s het getal 6, dan 4 s later het getal 7 enz. zonder dat daar een einde aan komt. Stel dat je dit proces na 15 s wil stoppen, dan gebruik je de methode clearInterval()

let getal = 5;
function verhoogEnToon() {
  getal++;
  console.log(getal);
}

// het resultaat van setInterval is een ID dat je kan gebruiken om het interval te stoppen
let timerId = setInterval(verhoogEnToon, 4000);
setTimeout(() => {
  clearInterval(timerId);
}, 15000);

Welke getallen toont de console als bovenstaande code wordt uitgevoerd?

Na 4 s wordt het getal 6 in de console geschreven, 4 s later volgt 7, dan 8. Het getal 9 komt niet meer aan bod, want dat komt pas 4 s na het getal 7, dus in totaal 16 s na het openen van de pagina. De clearInterval() methode stopt het interval echter na 15 s.

Onderstaand filmpje toon een eenvoudige (maar naïeve) manier om elke seconde de huidige tijd te tonen in de footer.