Πώς λειτουργεί η συνάρτηση setTimeout στη JavaScript;
sobes.tech AI
Απάντηση από AI
Το setTimeout προγραμματίζει την εκτέλεση μιας συνάρτησης ή ενός τμήματος κώδικα μετά από τον καθορισμένο αριθμό milliseconds.
Όταν καλείται το setTimeout, ο περιηγητής (ή το περιβάλλον εκτέλεσης Node.js) δημιουργεί έναν χρονόμετρο. Η συνάρτηση που περνάει στο setTimeout τοποθετείται στην ουρά των callback (task queue) μετά την παρέλευση του καθορισμένου χρόνου καθυστέρησης.
Η JavaScript είναι μονονηματική. Το κύριο νήμα εκτέλεσης (main thread) εκτελεί τον κώδικα διαδοχικά. Όταν το κύριο νήμα ολοκληρώσει τις τρέχουσες εργασίες, ελέγχει την ουρά των callback. Αν υπάρχουν λειτουργίες στην ουρά (π.χ., αυτές που έχουν καθυστερήσει με setTimeout) και το κύριο νήμα είναι ελεύθερο, εξάγει και εκτελεί την πρώτη.
Αυτό σημαίνει ότι το setTimeout(fn, 0) δεν εγγυάται την άμεση εκτέλεση της fn. Θα εκτελεστεί όσο το δυνατόν πιο σύντομα, αλλά μόνο μετά την ολοκλήρωση της τρέχουσας εκτέλεσης κώδικα στο κύριο νήμα.
Σύνταξη:
setTimeout(function, milliseconds, param1, param2, ...);
function: Η συνάρτηση που θέλουμε να εκτελεστεί.milliseconds: Ο αριθμός των milliseconds πριν την εκτέλεση της συνάρτησης. Αν παραλειφθεί, προεπιλογή είναι 0.param1, param2, ...: Προαιρετικά επιχειρήματα που θα περαστούν στη συνάρτηση κατά την κλήση.
Παράδειγμα:
// Θα εμφανίσει "Γειά!" μετά από 2 δευτερόλεπτα
setTimeout(function() {
console.log("Γειά!");
}, 2000);
// Μεταβίβαση επιχειρημάτων
function δείξεΜήνυμα(όνομα) {
console.log("Γειά, " + όνομα + "!");
}
setTimeoutδείξεΜήνυμα, 1000, "Κόσμος"); // Θα εμφανίσει "Γειά, Κόσμος!" μετά από 1 δευτερόλεπτο
Το setTimeout επιστρέφει ένα αριθμητικό ID του χρονόμετρου, το οποίο μπορεί να χρησιμοποιηθεί για την ακύρωση της προγραμματισμένης εκτέλεσης με clearTimeout.
Παράδειγμα χρήσης του clearTimeout:
let timerId = setTimeout(function() {
console.log("Αυτή η γραμμή δεν θα εμφανιστεί");
}, 3000);
console.log("Ο χρονόμετρος ξεκίνησε...");
// Ακύρωση του χρονόμετρου
clearTimeout(timerId);
console.log("Ο χρονόμετρος ακυρώθηκε.");
Σημαντικά σημεία:
- Η καθυστέρηση δεν εγγυάται ακριβώς, ειδικά υπό φορτίο υψηλού φόρτου στο κύριο νήμα. Ο καθορισμένος χρόνος είναι η ελάχιστη καθυστέρηση πριν τοποθετηθεί η συνάρτηση στην ουρά callback.
- Στο Node.js, οι χρονόμετροι διαχειρίζονται από το κύκλο γεγονότων (event loop), παρόμοια με τον περιηγητή.