Σε αντίθεση με άλλες γλώσσες προγραμματισμού, η JavaScript δεν έχει ενσωματωμένη μέθοδο ύπνου. Επομένως, δεν μπορείτε απλά να καλέσετε μια συνάρτηση sleep() για να θέσετε σε παύση ένα πρόγραμμα Node.js. Ωστόσο, υπάρχουν και άλλοι τρόποι με τους οποίους μπορείτε να κάνετε ένα πρόγραμμα να περιμένει για μια καθορισμένη ώρα.
Αυτό το σεμινάριο εξετάζει τρεις προσεγγίσεις: setTimeout, async/wait και το πακέτο sleep-promise.
Χρησιμοποιώντας τη setTimeout() για την αναμονή για έναν συγκεκριμένο χρόνο
ο setTimeout() Η συνάρτηση προγραμματίζει τον κώδικα για τον χρόνο εκτέλεσης που θα εκτελεστεί μόλις περάσει ένα καθορισμένο χρονικό διάστημα. Δέχεται συνάρτηση και χρόνο καθυστέρησης σε χιλιοστά του δευτερολέπτου. Εδώ είναι η σύνταξη:
setTimeout(λειτουργία(), timeInMs)
Για παράδειγμα, ας πούμε ότι είχατε μια συνάρτηση που εκτυπώνει στην κονσόλα:
λειτουργίαεκτύπωση πρότασης() {
console.log("Χρήση setTimeout()")
}
Για να εκτελέσετε την παραπάνω συνάρτηση μετά την πάροδο δύο δευτερολέπτων, περάστε τη συνάρτηση και τον χρόνο καθυστέρησης των 2000 ms στο setTimeout() λειτουργία:
setTimeout (printSentence, 2000)
Αν και αυτό λειτουργεί, δεν είναι εγγυημένο ότι η λειτουργία σας θα εκτελεστεί ακριβώς μετά από δύο δευτερόλεπτα. Σίγουρα θα χρειαστεί τουλάχιστον αυτό το χρονικό διάστημα, αλλά μπορεί να χρειαστεί περισσότερος.
Είναι το setTimeout() Ακριβές;
Ναι, αλλά με κάποιες επιφυλάξεις. setTimeout() είναι ένα ασύγχρονη λειτουργία JavaScript που σημαίνει ότι δεν μπλοκάρει. Ο κώδικας που προγραμματίζετε προστίθεται στον βρόχο συμβάντος ενώ το υπόλοιπο πρόγραμμά σας συνεχίζεται.
Αφού περάσει ο χρόνος καθυστέρησης, το πρόγραμμά σας θα εκτελέσει τον προγραμματισμένο κώδικα, αλλά μόνο όταν είναι ελεύθερο να το κάνει. Εάν υπάρχει άλλος κωδικός στη στοίβα κλήσεων, θα εκτελεστεί πρώτος, ακόμα κι αν ο προγραμματισμένος κώδικας πρόκειται να εκτελεστεί. Εδώ μπορεί να προκύψει επιπλέον χρόνος καθυστέρησης, εξ ου και η ανακρίβεια.
Σκεφτείτε το παρακάτω πρόγραμμα.
console.log("Γειά σου Κόσμε!")
λειτουργίαεκτύπωση πρότασης() {
console.log("Χρήση setTimeout()")
}
setTimeout (printSentence, 2000)
console.log("Εγινε")
Δείτε τι θα εμφανίζει η κονσόλα όταν την εκτελείτε:
Γειά σου Κόσμε!
Εγινε
Χρήση setTimeout()
Αυτό το πρόγραμμα εισάγει μια καθυστέρηση, αλλά καθυστερεί μόνο τον κωδικό στον οποίο μεταβιβάζει setTimeout(). Το υπόλοιπο πρόγραμμα συνεχίζεται, με τον προγραμματισμένο κωδικό να το διακόπτει μόνο αφού παρέλθει η διάρκεια. Αν θέλετε να εκτελέσετε όλο αυτόν τον κώδικα με τη σειρά, με μια παύση στη μέση, χρησιμοποιώντας setTimeout() δεν θα δουλέψει.
Μια εναλλακτική είναι να γράψετε σύγχρονο κώδικα που θα μπλοκάρει την εκτέλεση για όσο διάστημα χρειάζεστε. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε ένα κάνε...ενώ βρόχο για να μπλοκάρει το νήμα εκτέλεσης μέχρι να τελειώσει ο χρόνος καθυστέρησης:
λειτουργίακαθυστέρηση(Κυρία) {
συνθ ημερομηνία = Ημερομηνία.τώρα();
αφήνω τρέχουσαΗμερομηνία = μηδενικό;κάνω {
τρέχουσαΗμερομηνία = Ημερομηνία.τώρα();
} ενώ (τρέχουσαΗμερομηνία - ημερομηνία < ms);
}
console.log("Γειά σου Κόσμε");
καθυστέρηση (2000);
console.log("Θα εκτυπωθεί μετά από 2 δευτερόλεπτα!");
ο καθυστέρηση() Η συνάρτηση βρίσκεται σε βρόχο έως ότου ο τρέχων χρόνος είναι ίσος ή μεγαλύτερος από τον χρόνο έναρξης συν την καθυστέρηση. Το μειονέκτημα αυτής της προσέγγισης είναι ότι έχει ένταση CPU, ειδικά με μεγάλες καθυστερήσεις. ο do...while βρόχος πρέπει να υπολογίσει τον χρόνο που απομένει μετά από κάθε χιλιοστό του δευτερολέπτου.
Χρήση Async/Await για καθυστέρηση ενός προγράμματος Node.js
Ενα αναμένω Η έκφραση προκαλεί παύση της εκτέλεσης μέχρι να επιλυθεί μια Υπόσχεση. Σας επιτρέπει να εκτελείτε ασύγχρονο κώδικα σαν να ήταν σύγχρονος, αλλά πιο αποτελεσματικά από ό, τι με μη αυτόματο αποκλεισμό της εκτέλεσης. Μπορείτε να χρησιμοποιήσετε την αναμονή μόνο μέσα σε μια λειτουργία που έχει επισημανθεί ασυγχρονισμός.
λειτουργίακαθυστέρηση(χρόνος) {
ΕΠΙΣΤΡΟΦΗνέοςΥπόσχεση(resolve => setTimeout (resolve, time));
}ασυγχρονισμόςλειτουργίαεκτύπωση πρότασης() {
console.log("Γειά σου Κόσμε")
αναμένω καθυστέρηση(2000);
console.log("Θα εκτυπωθεί μετά από 2 δευτερόλεπτα");
}
printSentence();
Αυτό είναι το αποτέλεσμα του παραπάνω προγράμματος:
Γειά σου Κόσμε
Θα εκτυπωθεί μετά από 2 δευτερόλεπτα
Χρήση του πακέτου ύπνου-υπόσχεσης
ο ύπνος-υπόσχεση Το πακέτο απλοποιεί τη διαδικασία παύσης των προγραμμάτων Node.js. Χρειάζεται μόνο να το καλέσετε και να καθορίσετε τον χρόνο καθυστέρησης σε χιλιοστά του δευτερολέπτου.
Ξεκινήστε εγκαθιστώντας το μέσω npm:
npm εγκαθιστώύπνος-υπόσχεση
Ακολουθεί ένα παράδειγμα για το πώς μπορείτε να το χρησιμοποιήσετε στο πρόγραμμά σας:
συνθ ύπνος = απαιτώ('sleep-promise');
(ασυγχρονισμός () => {
console.log("Γειά σου Κόσμε.");
αναμένω ύπνος(2000);
console.log("Θα εκτυπωθεί μετά από δύο δευτερόλεπτα.");
})();
Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι η εξής.
Γειά σου Κόσμε.
Θα εκτυπωθεί μετά από δύο δευτερόλεπτα.
Επιλογή κατάλληλης προσέγγισης
Η εφαρμογή μιας λειτουργικότητας ύπνου στο Node.js μπορεί να είναι δύσκολη. Όταν αποφασίζετε πώς να το κάνετε, σκεφτείτε τι θέλετε να πετύχετε. Εάν θέλετε απλώς να καθυστερήσετε κάποιο κωδικό, για ελάχιστο χρονικό διάστημα, setTimeout() είναι μια καλή επιλογή. Αλλά αν θέλετε να διακόψετε την εκτέλεση ολόκληρου του προγράμματος, θα πρέπει να χρησιμοποιήσετε ασυγχρονισμός/αναμονή.
Σύγχρονη vs. Ασύγχρονος Προγραμματισμός: Πώς διαφέρουν;
Διαβάστε Επόμενο
Σχετικά θέματα
- Προγραμματισμός
- Ανάπτυξη διαδικτύου
- Προγραμματισμός
- JavaScript
Σχετικά με τον Συγγραφέα

Η Mary Gathoni είναι μια προγραμματίστρια λογισμικού με πάθος για τη δημιουργία τεχνικού περιεχομένου που δεν είναι μόνο ενημερωτικό αλλά και συναρπαστικό. Όταν δεν κωδικοποιεί ή δεν γράφει, της αρέσει να κάνει παρέα με φίλους και να βρίσκεται σε εξωτερικούς χώρους.
Εγγραφείτε στο ενημερωτικό μας δελτίο
Εγγραφείτε στο ενημερωτικό μας δελτίο για συμβουλές τεχνολογίας, κριτικές, δωρεάν ebook και αποκλειστικές προσφορές!
Κάντε κλικ εδώ για να εγγραφείτε