# Stel werk uit met setTimeout2() en clearTimeout2()

> Gebruik setTimeout2() om een functie één keer uit te voeren nadat de aanroepen ophouden, waarbij de vorige timer met hetzelfde id wordt vervangen, en annuleer hem met clearTimeout2().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: nl
Content-SHA256: beb7466f0ce9c4d0db6af0eee99476c7380eca448fa2c1e1866a07f9010abc29
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`setTimeout2(id, callback, timeout)` is `setTimeout` met een naam. Als je het opnieuw aanroept met **hetzelfde id** voordat de tijd om is, wordt de vorige timer geannuleerd en vervangen: de callback draait één keer, nadat de aanroepen ophouden. Het is de gebruikelijke manier om maar één keer op te slaan, te herladen of opnieuw te berekenen wanneer veel gebeurtenissen tegelijk binnenkomen (een reeks wijzigingen, typen, een stortvloed aan berichten).

`clearTimeout2(id)` annuleert de timer van dat id en geeft `true` terug als er een was en `false` als er geen was.

De volledige vorm is `setTimeout2(id, callback, timeout, limit, a, b, c, d, e)`: de waarden na `limit` worden aan de callback doorgegeven. **Gebruik `limit` niet** in `total5` 0.0.19: het idee is de callback direct uit te voeren na `limit` vervangingen, maar de teller start nooit (hij is `undefined` en wordt `NaN`), dus de callback wordt pas aangeroepen als de tijd om is. Het voorbeeld roept hem tien keer aan met een limiet van 3 en de callback draaide niet te vroeg.

```js controllers/timers.js
exports.install = function() {
	ROUTE('GET /burst/', burst);
};

async function burst($) {

	const log = [];

	// three calls with the same id: only the last one runs
	setTimeout2('save', () => log.push('first'), 100);
	setTimeout2('save', () => log.push('second'), 100);
	setTimeout2('save', () => log.push('third'), 100);

	// a timer that is cancelled before it runs
	setTimeout2('gone', () => log.push('gone'), 100);
	const cancelled = clearTimeout2('gone');
	const nothing = clearTimeout2('never-set');

	// the values after the limit reach the callback
	setTimeout2('args', (a, b) => log.push(a + b), 50, 0, 'x', 'y');

	// the limit option does not run the callback early
	let early = 0;
	for (let i = 0; i < 10; i++)
		setTimeout2('limited', () => early++, 1000, 3);
	const stopped = clearTimeout2('limited');

	await new Promise(resolve => setTimeout(resolve, 300));
	$.json({ log: log, cancelled: cancelled, nothing: nothing, early: early, stopped: stopped });
}
```
