Middle
Ispričaj o posebnom slučaju korišćenja funkcije setTimeout sa nulvim vremenom kašnjenja.
sobes.tech АИ
Одговор од АИ
setTimeout(callback, 0) postavlja callback u red makro zadataka (red makro zadataka). Kod unutar callback će se izvršiti nakon što trenutni stek poziva bude prazan i nakon što sledeći ciklus event loop-a za makro zadatke bude obrađen.
Glavni scenariji korišćenja:
- Odloženo izvršenje nakon renderovanja: Omogućava izvršenje koda nakon što pretraživač obradi trenutne promene u DOM-u.
// Izmena DOM elementa element.textContent = 'Novi tekst'; // Odložena radnja koja zavisi od ažuriranog DOM-a setTimeout(() => { console.log('DOM ažuriran, može se raditi sa novim stanjem'); }, 0); - Podela dugotrajnih operacija: Pomaže da se izbegne blokiranje glavnog toka, razdvajanjem dugih računanja na manje delove, izvršavane u mikro zadacima (makro zadacima).
function processLargeData(data) { let i = 0; function processChunk() { const chunkSize = 1000; const end = Math.min(i + chunkSize, data.length); // Obrada dela podataka for (let j = i; j < end; j++) { // Uradi nešto sa data[j] } i = end; if (i < data.length) { // Odloži sledeći deo setTimeout(processChunk, 0); } else { console.log('Obrada završena'); } } processChunk(); } - Prenos izvršenja nakon glavnog skripta: Garantuje da će se određeni kod izvršiti nakon potpune inicijalizacije trenutnog skripta i obrade svih sinhronih operacija.
console.log('Početak skripta'); setTimeout(() => { console.log('Izvršava se nakon glavnog skripta'); }, 0); console.log('Kraj skripta'); // Izlaz: // Početak skripta // Kraj skripta // Izvršava se nakon glavnog skripta
Važno je napomenuti da nultno kašnjenje ne znači trenutnu izvršivost. Vreme izvršenja zavisi od opterećenja event loop-a i drugih zadataka u redovima (posebno mikro zadataka pre makro zadataka).