Middle
Vorbește despre un caz particular de utilizare a funcției setTimeout cu timp de întârziere zero.
sobes.tech AI
Răspuns de la AI
setTimeout(callback, 0) plasează callback în coada macro-tasks (coada macro-task-urilor). Codul din interiorul callback va fi executat după ce stiva curentă de apeluri va fi goală și următorul ciclu de event loop pentru macro-tasks va fi procesat.
Scenariile principale de utilizare:
- Executare întârziată după randare: Permite executarea codului după ce browser-ul a procesat modificările curente din DOM.
// Modificarea unui element DOM element.textContent = 'Text nou'; // Acțiune întârziată care depinde de actualizarea DOM setTimeout(() => { console.log('DOM actualizat, gata să lucreze cu noua stare'); }, 0); - Împărțirea operațiilor lungi: Ajută la prevenirea blocării thread-ului principal, împărțind calculele lungi în părți mai mici, executate în micro-tasks (macro-tasks).
function processLargeData(data) { let i = 0; function processChunk() { const chunkSize = 1000; const end = Math.min(i + chunkSize, data.length); // Procesarea unei părți din date for (let j = i; j < end; j++) { // Faceți ceva cu data[j] } i = end; if (i < data.length) { // Amână următoarea parte setTimeout(processChunk, 0); } else { console.log('Procesare finalizată'); } } processChunk(); } - Transferul execuției după scriptul principal: Asigură că anumit cod va fi executat după inițializarea completă a scriptului curent și procesarea tuturor operațiilor sincrone.
console.log('Începutul scriptului'); setTimeout(() => { console.log('Execută după scriptul principal'); }, 0); console.log('Sfârșitul scriptului'); // Ieșire: // Începutul scriptului // Sfârșitul scriptului // Execută după scriptul principal
Este important de reținut că o întârziere zero nu înseamnă execuție instantanee. Timpul de execuție depinde de încărcarea event loop-ului și de alte sarcini din cozi (în special micro-tasks înainte de macro-tasks).