Sobes.tech
Junior

Kuidas töötab setTimeout funktsioon JavaScriptis?

sobes.tech AI

Vastus AI-lt

setTimeout plaanib funktsiooni või koodilõigu täitmise määratud millisekundite pärast.

Kui kutsutakse setTimeout, brauser (või Node.js täitmis- või töökeskkond) loob ajastaja. setTimeout-ile antud funktsioon asetatakse tagasihelistuste järjekorda (task queue) pärast määratud viivitust.

JavaScript on ühethreadiline. Peamine voog (main thread) täidab koodi järjekorras. Kui peamine voog lõpetab jooksva ülesande, kontrollib ta tagasihelistuste järjekorda. Kui järjekorras on funktsioone (näiteks setTimeout abil edasi lükatud) ja peamine voog on vaba, võtab ta esimese funktsiooni ja täidab selle.

See tähendab, et setTimeout(fn, 0) ei garanteeri fn kohest täitmist. See täidetakse niipea kui võimalik, kuid alles pärast praeguse koodi täitmise lõpetamist.

Süntaks:

setTimeout(function, milliseconds, param1, param2, ...);
  • function: Funktsioon, mida tuleb täita.
  • milliseconds: Aeg millisekundites enne funktsiooni täitmist. Kui see on vahele jäetud, siis vaikimisi 0.
  • param1, param2, ...: Valikulised argumendid, mis antakse funktsioonile selle väljakutsumisel.

Näide:

// Kuvab "Tere!" 2 sekundi pärast
setTimeout(function() {
  console.log("Tere!");
}, 2000);

// Argumentide edastamine
funktsioon näidataTeadet(nimi) {
  console.log("Tere, " + nimi + "!");
}

setTimeout(näidataTeadet, 1000, "Maailm"); // Kuvab "Tere, Maailm!" 1 sekundi pärast

setTimeout tagastab numbrilise ajastaja ID, mida saab kasutada planeeritud täitmise tühistamiseks clearTimeout-i abil:

Näide clearTimeout kasutamisest:

lõpetaAeg = setTimeout(function() {
  console.log("See rida ei kuvata");
}, 3000);

console.log("Aeg on käivitunud...");

// Tühista ajastaja
clearTimeout(lõpetaAeg);

console.log("Aeg tühistatud.");

Oluline punkt:

  • Viivitus ei ole täpne, eriti suure koormuse korral. Määratud aeg on minimaalne, mille jooksul funktsioon jõuab tagasihelistuste järjekorda.
  • Node.js-is hallatakse ajastajaid sündmuste tsükliga (event loop), nagu ka brauseris.