# Temporiser un travail avec setTimeout2() et clearTimeout2()

> Utilisez setTimeout2() pour exécuter une fonction une seule fois quand les appels cessent, en remplaçant le minuteur précédent de même identifiant, et annulez-le avec clearTimeout2().

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

`setTimeout2(id, callback, timeout)` est `setTimeout` avec un nom. Quand vous l'appelez de nouveau avec le **même id** avant la fin du délai, le minuteur précédent est annulé et remplacé : le callback s'exécute une fois, quand les appels cessent. C'est la façon habituelle d'enregistrer, de recharger ou de recalculer une seule fois quand de nombreux événements arrivent ensemble (une rafale de modifications, la saisie, un flot de messages).

`clearTimeout2(id)` annule le minuteur de cet id et renvoie `true` quand il y en avait un et `false` sinon.

La forme complète est `setTimeout2(id, callback, timeout, limit, a, b, c, d, e)` : les valeurs après `limit` sont transmises au callback. **N'utilisez pas `limit`** dans `total5` 0.0.19 : l'idée est d'exécuter le callback immédiatement après `limit` remplacements, mais le compteur ne démarre jamais (il est `undefined` et devient `NaN`), de sorte que le callback n'est appelé qu'à la fin du délai. L'exemple l'appelle dix fois avec une limite de 3 et le callback ne s'est pas exécuté plus tôt.

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