ForgeTotal.js 5
el

Total.js 5

Καθυστερήστε εργασία με τα setTimeout2() και clearTimeout2()

Total.js 5 · total5@0.0.19 timersdebounceutilities Εκτελέστηκε με το Total.js 5

Το setTimeout2(id, callback, timeout) είναι το setTimeout με ένα όνομα. Όταν το καλέσετε ξανά με το ίδιο id πριν περάσει ο χρόνος, ο προηγούμενος χρονοδιακόπτης ακυρώνεται και αντικαθίσταται: το callback εκτελείται μία φορά, αφού σταματήσουν οι κλήσεις. Είναι ο συνηθισμένος τρόπος να αποθηκεύσετε, να φορτώσετε ξανά ή να υπολογίσετε ξανά μία μόνο φορά όταν φτάνουν πολλά γεγονότα μαζί (μια ριπή αλλαγών, η πληκτρολόγηση, ένας κατακλυσμός μηνυμάτων).

Το clearTimeout2(id) ακυρώνει τον χρονοδιακόπτη αυτού του id και επιστρέφει true όταν υπήρχε ένας και false όταν δεν υπήρχε.

Η πλήρης μορφή είναι setTimeout2(id, callback, timeout, limit, a, b, c, d, e): οι τιμές μετά το limit περνούν στο callback. Μην χρησιμοποιείτε το limit στο total5 0.0.19: η ιδέα είναι να εκτελείται το callback αμέσως μετά από limit αντικαταστάσεις, αλλά ο μετρητής δεν ξεκινά ποτέ (είναι undefined και γίνεται NaN), οπότε το callback καλείται μόνο όταν περάσει ο χρόνος. Το παράδειγμα το καλεί δέκα φορές με όριο 3 και το callback δεν εκτελέστηκε νωρίτερα.

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