# Skjut upp arbete med setTimeout2() och clearTimeout2()

> Använd setTimeout2() för att köra en funktion en gång efter att anropen slutat komma, där den tidigare timern med samma id ersätts, och avbryt den med clearTimeout2().

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

`setTimeout2(id, callback, timeout)` är `setTimeout` med ett namn. När du anropar den igen med **samma id** innan tiden gått ut avbryts den tidigare timern och ersätts: callbacken körs en gång, efter att anropen slutat komma. Det är det vanliga sättet att spara, ladda om eller räkna om bara en gång när många händelser kommer tillsammans (en skur av ändringar, skrivande, en flod av meddelanden).

`clearTimeout2(id)` avbryter timern för det id:t och returnerar `true` när det fanns en och `false` när det inte fanns någon.

Den fullständiga formen är `setTimeout2(id, callback, timeout, limit, a, b, c, d, e)`: värdena efter `limit` skickas till callbacken. **Använd inte `limit`** i `total5` 0.0.19: tanken är att köra callbacken direkt efter `limit` ersättningar, men räknaren startar aldrig (den är `undefined` och blir `NaN`), så callbacken anropas bara när tiden är ute. Exemplet anropar den tio gånger med gränsen 3 och callbacken kördes inte i förtid.

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