Sobes.tech
Middle

Pověz o zvláštním případě použití funkce setTimeout s nulovou prodlevou.

sobes.tech AI

Odpověď od AI

setTimeout(callback, 0) umístí callback do fronty makro úkolů (fronta makro úkolů). Kód uvnitř callback bude proveden poté, co bude prázdný aktuální zásobník volání a bude zpracován následující cyklus událostí makro úkolů.

Hlavní scénáře použití:

  • Zpožděné provedení po renderování: Umožňuje spustit kód poté, co prohlížeč zpracuje aktuální změny v DOM.
    // Změna prvku DOM
    element.textContent = 'Nový text';
    
    // Zpožděná akce závislá na aktualizovaném DOM
    setTimeout(() => {
      console.log('DOM aktualizován, lze pracovat s novým stavem');
    }, 0);
    
  • Rozdělení dlouhých operací: Pomáhá zabránit zablokování hlavního vlákna, rozdělením dlouhých výpočtů na menší části, prováděné v mikroúkolech (makro úkolech).
    function processLargeData(data) {
      let i = 0;
      function processChunk() {
        const chunkSize = 1000;
        const end = Math.min(i + chunkSize, data.length);
    
        // Zpracování části dat
        for (let j = i; j < end; j++) {
          // Něco s data[j]
        }
    
        i = end;
        if (i < data.length) {
          // Odložit další část
          setTimeout(processChunk, 0);
        } else {
          console.log('Zpracování dokončeno');
        }
      }
      processChunk();
    }
    
  • Předání provádění po hlavním skriptu: Zajišťuje, že určitý kód bude proveden po úplné inicializaci aktuálního skriptu a zpracování všech synchronních operací.
    console.log('Začátek skriptu');
    
    setTimeout(() => {
      console.log('Provádí se po hlavním skriptu');
    }, 0);
    
    console.log('Konec skriptu');
    // Výstup:
    // Začátek skriptu
    // Konec skriptu
    // Provádí se po hlavním skriptu
    

Je důležité si uvědomit, že nulové zpoždění neznamená okamžité provedení. Čas provedení závisí na zatížení event loopu a dalších úkolech ve frontách (zejména mikroúkolech před makroúkoly).