בניגוד לשפות תכנות אחרות, ל-JavaScript אין שיטת שינה מובנית. אז אתה לא יכול פשוט לקרוא לפונקציה sleep() כדי להשהות תוכנית Node.js. עם זאת, ישנן דרכים אחרות שבהן תוכל לגרום לתוכנית להמתין לזמן מוגדר.
מדריך זה דן בשלוש גישות: setTimeout, async/await וחבילת הבטחת שינה.
שימוש ב-setTimeout() כדי להמתין לזמן מסוים
ה setTimeout() הפונקציה מתזמנת קוד עבור זמן הריצה לביצוע לאחר שעבר פרק זמן מוגדר. הוא מקבל פונקציה וזמן השהייה באלפיות שניות. הנה התחביר:
setTimeout(פוּנקצִיָה(), timeInMs)
לדוגמה, נניח שהייתה לך פונקציה שמדפיסה על הקונסולה:
פוּנקצִיָהמשפט הדפס() {
console.log("שימוש ב-setTimeout()")
}
כדי להפעיל את הפונקציה לעיל לאחר שחלפו שתי שניות, העבר את הפונקציה וזמן ההשהיה של 2000 שניות ל- setTimeout() פוּנקצִיָה:
setTimeout (printSentence, 2000)
אמנם זה עובד, אבל לא מובטח שהפונקציה שלך תפעל בדיוק לאחר שתי שניות. זה בהחלט ייקח לפחות פרק זמן כזה, אבל זה עלול לקחת יותר.
האם setTimeout() מדויק?
כן, אבל עם כמה אזהרות. setTimeout() הוא פונקציית JavaScript אסינכרונית מה שאומר שהוא לא חוסם. הקוד שתזמנת מתווסף ללופ האירוע בזמן ששאר התוכנית שלך נמשכת.
לאחר שעובר זמן ההשהיה, התוכנית שלך תפעיל את הקוד המתוכנן, אך רק כאשר היא חופשית לעשות זאת. אם קוד אחר נמצא בערימת השיחות, הוא יתבצע תחילה, גם אם הקוד המתוזמן אמור לפעול. זה המקום שבו זמן עיכוב נוסף יכול להתרחש, ומכאן חוסר הדיוק.
שקול את התוכנית הבאה.
console.log("שלום עולם!")
פוּנקצִיָהמשפט הדפס() {
console.log("שימוש ב-setTimeout()")
}
setTimeout (printSentence, 2000)
console.log("בוצע")
הנה מה שהקונסולה תציג כשאתה מפעיל אותה:
שלום עולם!
בוצע
שימוש ב-setTimeout()
תוכנית זו מציגה השהייה, אך היא מעכבת רק את הקוד שאליו היא עוברת setTimeout(). שאר התוכנית נמשכת, כאשר הקוד המתוכנן מפריע לה רק לאחר שהמשך חלף. אם אתה רוצה להריץ את כל הקוד הזה לפי הסדר, עם הפסקה באמצע, באמצעות setTimeout() לא יעבוד.
חלופה אחת היא לכתוב קוד סינכרוני שיחסום את הביצוע כל עוד אתה צריך. לדוגמה, אתה יכול להשתמש ב-a עושה תוך כדי לולאה כדי לחסום את פתיל הביצוע עד שזמן ההשהיה יסתיים:
פוּנקצִיָהלְעַכֵּב(גברת) {
const תאריך = תַאֲרִיך.עַכשָׁיו();
תן currentDate = ריק;לַעֲשׂוֹת {
currentDate = תַאֲרִיך.עַכשָׁיו();
} בזמן (currentDate - תאריך < ms);
}
console.log("שלום עולם");
עיכוב (2000);
console.log("יודפס לאחר 2 שניות!");
ה לְעַכֵּב() פונקציות לולאות עד שהזמן הנוכחי שווה או גדול מזמן ההתחלה שלו בתוספת ההשהיה. החיסרון של גישה זו הוא שהיא אינטנסיבית של מעבד, במיוחד עם עיכובים גדולים. ה לעשות... תוך כדי לולאה צריך לחשב את הזמן שנותר לאחר כל אלפית שנייה.
שימוש ב-Async/Await כדי לעכב תוכנית Node.js
א לְהַמתִין ביטוי גורם לביצוע להשהות עד שהבטחה נפתרת. זה מאפשר לך להריץ קוד אסינכרוני כאילו הוא סינכרוני, אבל בצורה יעילה יותר מאשר על ידי חסימה ידנית של ביצוע. אתה יכול להשתמש רק בהמתנה בתוך פונקציה מסומנת אסינכרון.
פוּנקצִיָהלְעַכֵּב(זְמַן) {
לַחֲזוֹרחָדָשׁהַבטָחָה(resolve => setTimeout (resolve, time));
}אסינכרוןפוּנקצִיָהמשפט הדפס() {
console.log("שלום עולם")
לְהַמתִין לְעַכֵּב(2000);
console.log("יודפס לאחר 2 שניות");
}
printSentence();
זה הפלט של התוכנית לעיל:
שלום עולם
יודפס לאחר 2 שניות
שימוש בחבילת הבטחת שינה
ה שינה-הבטחה החבילה מפשטת את תהליך השהיית תוכניות Node.js. אתה רק צריך לקרוא לזה ולציין את זמן ההשהיה באלפיות שניות.
התחל בהתקנתו דרך npm:
npm להתקיןלִישׁוֹן-הַבטָחָה
להלן דוגמה כיצד תוכל להשתמש בו בתוכנית שלך:
const לישון = לִדרוֹשׁ('שינה-הבטחה');
(אסינכרון () => {
console.log("שלום עולם.");
לְהַמתִין לִישׁוֹן(2000);
console.log("יודפס לאחר שתי שניות.");
})();
כאשר אתה מפעיל את התוכנית, הפלט יהיה כדלקמן.
שלום עולם.
יודפס לאחר שתי שניות.
בחירת גישה מתאימה
הטמעת פונקציונליות שינה ב-Node.js יכולה להיות מסובכת. כשאתה מחליט כיצד לפעול, שקול מה אתה רוצה להשיג. אם אתה רק רוצה לעכב קוד כלשהו, למשך זמן מינימלי, setTimeout() היא אופציה טובה. אבל אם אתה רוצה להשהות את הביצוע של כל התוכנית שלך, אתה צריך להשתמש אסינכרן/ממתין.
סינכרוני לעומת תכנות אסינכרוני: במה הם שונים?
קרא הבא
נושאים קשורים
- תִכנוּת
- בניית אתרים
- תִכנוּת
- JavaScript
על הסופר
מרי גאתוני היא מפתחת תוכנה עם תשוקה ליצור תוכן טכני שהוא לא רק אינפורמטיבי אלא גם מרתק. כשהיא לא מקודדת או כותבת, היא נהנית לבלות עם חברים ולהיות בחוץ.
הירשם לניוזלטר שלנו
הצטרף לניוזלטר שלנו לקבלת טיפים טכניים, ביקורות, ספרים אלקטרוניים בחינם ומבצעים בלעדיים!
לחץ כאן כדי להירשם