Sobes.tech
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).