Sobes.tech
Middle

Vertel over een bijzonder geval van het gebruik van de functie setTimeout met een nul vertragingstijd.

sobes.tech AI

Antwoord van AI

setTimeout(callback, 0) plaatst callback in de wachtrij voor macro-taken (macro-taak wachtrij). De code binnen callback wordt uitgevoerd nadat de huidige call stack leeg is en de volgende macro-taakcyclus van de event loop is verwerkt.

De belangrijkste gebruiksscenario's:

  • Uitgestelde uitvoering na rendering: Maakt het mogelijk om code uit te voeren nadat de browser de huidige wijzigingen in de DOM heeft verwerkt.
    // Wijziging van een DOM-element
    element.textContent = 'Nieuwe tekst';
    
    // Uitgestelde actie die afhankelijk is van de bijgewerkte DOM
    setTimeout(() => {
      console.log('DOM bijgewerkt, klaar om met de nieuwe staat te werken');
    }, 0);
    
  • Opsplitsen van lange operaties: Helpt voorkomen dat de hoofdthread blokkeert door lange berekeningen op te splitsen in kleinere delen, uitgevoerd in micro-taken (macro-taken).
    function processLargeData(data) {
      let i = 0;
      function processChunk() {
        const chunkSize = 1000;
        const end = Math.min(i + chunkSize, data.length);
    
        // Verwerking van een deel van de data
        for (let j = i; j < end; j++) {
          // Doe iets met data[j]
        }
    
        i = end;
        if (i < data.length) {
          // Wacht met de volgende deel
          setTimeout(processChunk, 0);
        } else {
          console.log('Verwerking voltooid');
        }
      }
      processChunk();
    }
    
  • Overdracht van uitvoering na de hoofdscript: Zorgt ervoor dat bepaalde code wordt uitgevoerd na volledige initialisatie van het huidige script en verwerking van alle synchronisatie-operaties.
    console.log('Begin van script');
    
    setTimeout(() => {
      console.log('Wordt uitgevoerd na het hoofdscript');
    }, 0);
    
    console.log('Einde van script');
    // Uitvoer:
    // Begin van script
    // Einde van script
    // Wordt uitgevoerd na het hoofdscript
    

Het is belangrijk op te merken dat een vertraging van nul niet betekent dat de uitvoering onmiddellijk plaatsvindt. De uitvoeringstijd hangt af van de belasting van de event loop en andere taken in de wachtrijen (vooral micro-taken vóór macro-taken).