ForgeTotal.js 5
cs

Total.js 5

Odkládejte práci pomocí setTimeout2() a clearTimeout2()

Total.js 5 · total5@0.0.19 timersdebounceutilities Spuštěno s Total.js 5

setTimeout2(id, callback, timeout) je setTimeout s názvem. Když jej zavoláte znovu se stejným id před uplynutím času, předchozí časovač se zruší a nahradí: callback se spustí jednou, když volání přestanou přicházet. Je to obvyklý způsob, jak uložit, znovu načíst nebo přepočítat jen jednou, když najednou přichází mnoho událostí (série změn, psaní, záplava zpráv).

clearTimeout2(id) zruší časovač s tímto id a vrátí true, když nějaký byl, a false, když nebyl.

Úplný tvar je setTimeout2(id, callback, timeout, limit, a, b, c, d, e): hodnoty za limit se předají callbacku. Nepoužívejte limit v total5 0.0.19: záměrem je spustit callback ihned po limit nahrazeních, ale počítadlo se nikdy nespustí (je undefined a stane se NaN), takže se callback zavolá až po uplynutí času. Příklad jej volá desetkrát s limitem 3 a callback se nespustil předčasně.

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