# Ritarda il lavoro con setTimeout2() e clearTimeout2()

> Usa setTimeout2() per eseguire una funzione una sola volta quando le chiamate smettono di arrivare, sostituendo il timer precedente con lo stesso id, e annullalo con clearTimeout2().

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

`setTimeout2(id, callback, timeout)` è `setTimeout` con un nome. Quando lo richiami con lo **stesso id** prima che il tempo sia finito, il timer precedente viene annullato e sostituito: il callback viene eseguito una volta, quando le chiamate smettono di arrivare. È il modo usuale per salvare, ricaricare o ricalcolare una sola volta quando molti eventi arrivano insieme (una raffica di modifiche, la digitazione, un flusso di messaggi).

`clearTimeout2(id)` annulla il timer di quell'id e restituisce `true` quando ce n'era uno e `false` quando non c'era.

La forma completa è `setTimeout2(id, callback, timeout, limit, a, b, c, d, e)`: i valori dopo `limit` vengono passati al callback. **Non usare `limit`** in `total5` 0.0.19: l'idea è eseguire subito il callback dopo `limit` sostituzioni, ma il contatore non parte mai (è `undefined` e diventa `NaN`), quindi il callback viene chiamato solo quando il tempo è finito. L'esempio lo richiama dieci volte con un limite di 3 e il callback non è stato eseguito in anticipo.

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