ForgeTotal.js 5
sv

Total.js 5

Skjut upp arbete med setTimeout2() och clearTimeout2()

Total.js 5 · total5@0.0.19 timersdebounceutilities Körd med Total.js 5

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.

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