Sobes.tech
Middle

Povedajte o špeciálnom prípade použitia funkcie setTimeout s nulovým časom oneskorenia.

sobes.tech AI

Odpoveď od AI

setTimeout(callback, 0) umiestni callback do radu makro úloh (fronta makro úloh). Kód vo vnútri callback sa vykoná po tom, čo aktuálna zásobník volaní bude prázdna a bude spracovaný nasledujúci cyklus event loopu pre makro úlohy.

Hlavné scenáre použitia:

  • Oneskorené vykonanie po renderovaní: Umožňuje vykonať kód po tom, čo prehliadač spracuje aktuálne zmeny v DOM.
    // Zmena prvku DOM
    element.textContent = 'Nový text';
    
    // Oneskorená akcia závislá od aktualizovaného DOM
    setTimeout(() => {
      console.log('DOM aktualizovaný, možné pracovať s novým stavom');
    }, 0);
    
  • Rozdelenie dlhých operácií: Pomáha predísť blokovaniu hlavného vlákna, rozdeľovaním dlhých výpočtov na menšie časti, vykonávané v mikroúlohách (makroúlohách).
    function processLargeData(data) {
      let i = 0;
      function processChunk() {
        const chunkSize = 1000;
        const end = Math.min(i + chunkSize, data.length);
    
        // Spracovanie časti dát
        for (let j = i; j < end; j++) {
          // Niečo s data[j]
        }
    
        i = end;
        if (i < data.length) {
          // Odložiť ďalšiu časť
          setTimeout(processChunk, 0);
        } else {
          console.log('Spracovanie ukončené');
        }
      }
      processChunk();
    }
    
  • Prenos vykonania po hlavnom skripte: Zabezpečuje, že určitý kód bude vykonaný po úplnej inicializácii aktuálneho skriptu a spracovaní všetkých synchronných operácií.
    console.log('Začiatok skriptu');
    
    setTimeout(() => {
      console.log('Vykonáva sa po hlavnom skripte');
    }, 0);
    
    console.log('Koniec skriptu');
    // Výstup:
    // Začiatok skriptu
    // Koniec skriptu
    // Vykonáva sa po hlavnom skripte
    

Dôležité je poznamenať, že nulové oneskorenie neznamená okamžité vykonanie. Čas vykonania závisí od zaťaženia event loopu a ďalších úloh vo frontách (najmä mikroúloh pred makroúlohami).