ForgeTotal.js 5
sk

Total.js 5

Oneskorte prácu pomocou setTimeout2() a clearTimeout2()

Total.js 5 · total5@0.0.19 timersdebounceutilities Spustené s Total.js 5

setTimeout2(id, callback, timeout) je setTimeout s názvom. Keď ho zavoláte znova s rovnakým id pred uplynutím času, predchádzajúci časovač sa zruší a nahradí: callback sa spustí raz, keď volania prestanú prichádzať. Je to obvyklý spôsob, ako uložiť, znova načítať alebo prepočítať iba raz, keď naraz prichádza veľa udalostí (séria zmien, písanie, záplava správ).

clearTimeout2(id) zruší časovač s týmto id a vráti true, keď nejaký bol, a false, keď nebol.

Úplný tvar je setTimeout2(id, callback, timeout, limit, a, b, c, d, e): hodnoty za limit sa odovzdajú callbacku. Nepoužívajte limit v total5 0.0.19: zámerom je spustiť callback hneď po limit nahradeniach, ale počítadlo sa nikdy nespustí (je undefined a stane sa NaN), takže sa callback zavolá až po uplynutí času. Príklad ho volá desaťkrát s limitom 3 a callback sa nespustil predčasne.

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