הקדמה
הבטחות בג'אווהסקריפט יכולות להיות מאתגרות להבנה. לכן, אני רוצה לרשום את הדרך שבה אני מבין את ההבטחות.
הבנת ההבטחות
הבטחה בקצרה:
"תאר לעצמך שאתה ילד. אמא שלך מבטיחה לך שהיא תקנה לך טלפון חדש בשבוע הבא."
אתה לא יודע אם תקבל את הטלפון הזה עד שבוע הבא. אמא שלך יכולה באמת לקנות לך טלפון חדש מזה, או שהיא לא.
זו הבטחה. להבטחה יש שלושה מצבים. הם הם:
- ממתין: אתה לא יודע אם תקבל את הטלפון הזה
- מלא: אמא שמחה, היא קונה לך טלפון חדש מזה
- נדחה: אמא לא שמחה, היא לא קונה לך טלפון
יצירת הבטחה
בואו נמיר את זה לג'אווהסקריפט.
הקוד עצמו מדבר בפני עצמו.
להלן כיצד נראה תחביר ה-Promise בדרך כלל:
צריכת Promises
עכשיו שיש לנו את ה-Promise, בואו נצרוך אותו:
בואו נפעיל את הדוגמה ונראה את התוצאה!
דמו: https://jsbin.com/nifocu/1/edit?js,console
שרשור של הבטחות
הבטחות ניתנות לשרשור.
נניח שאתה, הילד, מבטיח לחברך שתראיין להם את הטלפון החדש כשאמא תקנה לך אחד.
זו הבטחה נוספת. בואו נכתוב אותה!
הערות: אנו יכולים לקצר את הקוד הנ"ל על ידי כתיבה כפי שמוצג להלן:
בואו נשרשר את ההבטחות. אתה, הילד, יכול להתחיל את ההבטחה showOff
רק לאחר ההבטחה willIGetNewPhone
.
ככה אתה יכול לשרשר את ההבטחה.
הבטחות הן אסינכרוניות
הבטחות הן אסינכרוניות. בואו נרשום הודעה לפני ואחרי שאנו קוראים להבטחה.
מהי סדרת הפלט הצפוי? ייתכן שתצפו:
1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom
עם זאת, סדרת הפלט האמיתית היא:
1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.
לא תפסיקו לשחק בזמן המתנה להבטחת האמא שלכם (הטלפון החדש). זה משהו שאנו קוראים לו אסינכרוני: הקוד ירוץ ללא חסימה או המתנה לתוצאה. כל דבר שצריך לחכות להבטחה כדי להמשיך מוכנס לתוך .then
.
הנה הדוגמה המלאה ב-ES5:
Promises ב-ES5, ES6/2015, ES7/Next
ES5 – דפדפנים רבים
קוד הדמו פועל בסביבות ES5 (כל הדפדפנים המרכזיים + NodeJs) אם תכלול את ספריית ה-Promise Bluebird. זה בגלל ש-ES5 לא תומך ב-Promises משלו. ספריית Promise מפורסמת אחרת היא Q על ידי Kris Kowal.
ES6 / ES2015 – דפדפנים מודרניים, NodeJs v6
הקוד הדגום פועל מכניסה בגלל ש-ES6 תומך בבטחונות מקורית. בנוסף, עם פונקציות ES6, אנו יכולים לפשט עוד יותר את הקוד עם פונקציה חץ ולהשתמש ב-const
ו-let
.
הנה הדוגמה המלאה בקוד ES6:
שימו לב שכל ה-var
הוחלפו ב-const
. כל ה-function(resolve, reject)
הפכו לפשוטים יותר ל-(resolve, reject) =>
. יש כמה יתרונות שמגיעים עם השינויים האלה.
ES7 – Async/Await
ES7 הציג async
ו-await
תחביר. זה מקל על התחביר האסינכרוני להבנה, מבלי ה-.then
ו-.catch
.
כתוב מחדש את הדוגמה שלנו עם תחביר ES7:
הבטחות ומתי להשתמש בהם
למה אנו זקוקים להבטחות? איך נראה העולם לפני הבטחות? לפני שנענה על שאלות אלה, בואו נחזור ליסודות.
פונקציה רגילה מול פונקציה אסינכרונית
בואו נסתכל על שני הדוגמאות האלה. שתי הדוגמאות מבצעות חיבור של שני מספרים: אחת מוסיפה באמצעות פונקציות רגילות, והשנייה מוסיפה מרוחק.
פונקציה רגילה לחיבור שני מספרים
פונקציה אסינכרונית לחיבור שני מספרים
אם אתה מוסיף את המספרים עם הפונקציה הרגילה, אתה מקבל את התוצאה מיידית. עם זאת, כאשר אתה מבצע קריאה מרוחקת כדי לקבל את התוצאה, אתה צריך לחכות, ואתה לא יכול לקבל את התוצאה מיידית.
אתה לא יודע אם תקבל את התוצאה כי השרת עשוי להיות לא זמין, או איטי בתגובה וכו'. אתה לא רוצה שכל התהליך שלך יהיה מושהה בזמן שאתה מחכה לתוצאה.
קריאת APIs, הורדת קבצים וקריאת קבצים הם כמה מהפעולות האסינכרוניות הרגילות שתבצע.
אין צורך להשתמש בפרומיסים לשיחה אסינכרונית. לפני פרומיסים, השתמשנו בקולבקים. קולבקים הם פונקציה שאתה קורא כשאתה מקבל את התוצאה. בואו נשנה את הדוגמה הקודמת להקל על קבלת קולבק.
פעולה אסינכרונית נוספת
במקום להוסיף את המספרים פעם אחת בכל פעם, אנו רוצים להוסיף שלוש פעמים. בפונקציה רגילה, היינו עושים זאת:-
כך זה נראה עם קריאות חזרה:
דוגמא: https://jsbin.com/barimo/edit?html,js,console
תחביר זה הוא פחות ידידותי למשתמש בשל הקריאות החזרה המקוננות עמוקה.
הימנעות מקריאות חזרה מקוננות עמוקה
הבטחות יכולות לעזור לך להימנע מקריאות חזרה מקוננות עמוקה. בואו נביט בגרסת הבטחה של אותה דוגמה:
עם הבטחות, אנו משטחים את הקריאה לפונקציה עם .then
. בדרך זו, זה נראה יותר נקי כי אין קריאה לפונקציה מקוננת. עם תחביר async
של ES7, תוכלו לשפר עוד יותר את הדוגמה הזו.
משתנים תצוגה
לפני שאתה מתיישב עם הבטחות, יש משהו שהתפתח כדי לעזור לך להתמודד עם נתונים אסינכרוניים שנקרא משתנים תצוגה
.
בואו נביט בדוגמה זהה שנכתבה עם משתנים תצוגה. בדוגמה זו, נשתמש RxJS עבור המשתנים תצוגה.
משתנים תצוגה יכולים לעשות דברים מעניינים יותר. למשל, עיכוב
להוסיף פונקציה על ידי 3 שניות
עם רק שורת קוד אחת או לנסות שוב כך שתוכל לנסות שוב קריאה מספר פעמים.
אתה יכול לקרוא אחד מהפוסטים שלי על RxJs כאן.
סיכום
להכיר קרובות את הקולבקים וההבטחות חשוב. הבינו אותם והשתמשו בהם. אל תדאגו לגבי צופים עדיין. כל שלושתם יכולים להשפיע על הפיתוח שלך בהתאם למצב.
Source:
https://www.digitalocean.com/community/tutorials/understanding-javascript-promises