Odkládejte práci pomocí setTimeout2() a clearTimeout2()
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ě.
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 });
}