Ritarda il lavoro con setTimeout2() e clearTimeout2()
setTimeout2(id, callback, timeout) è setTimeout con un nome. Quando lo richiami con lo stesso id prima che il tempo sia finito, il timer precedente viene annullato e sostituito: il callback viene eseguito una volta, quando le chiamate smettono di arrivare. È il modo usuale per salvare, ricaricare o ricalcolare una sola volta quando molti eventi arrivano insieme (una raffica di modifiche, la digitazione, un flusso di messaggi).
clearTimeout2(id) annulla il timer di quell'id e restituisce true quando ce n'era uno e false quando non c'era.
La forma completa è setTimeout2(id, callback, timeout, limit, a, b, c, d, e): i valori dopo limit vengono passati al callback. Non usare limit in total5 0.0.19: l'idea è eseguire subito il callback dopo limit sostituzioni, ma il contatore non parte mai (è undefined e diventa NaN), quindi il callback viene chiamato solo quando il tempo è finito. L'esempio lo richiama dieci volte con un limite di 3 e il callback non è stato eseguito in anticipo.
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 });
}