ForgeTotal.js 5
fr

Total.js 5

Temporiser un travail avec setTimeout2() et clearTimeout2()

Total.js 5 · total5@0.0.19 timersdebounceutilities Exécutée avec Total.js 5

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.

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