
new Promise(...).resolve ו-reject. resolve קורא להצלחה ו-reject לכישלון. אלה השמות המקובלים, והם מתאימים ל-callbacks מהשיעור הקודם.setTimeout והחישוב נשארת כמעט אותו דבר. במקום לקרוא ל-callback קוראים resolve(sum), ובכישלון reject(error)..then(...): מקבל את הפונקציה של ההצלחה..catch(...): מקבל את הפונקציה של הכישלון.then מחזיר את הפרומיס עצמו, אפשר לשרשר אחריו את catch. הקוד הקורא ממשיך לרוץ בזמן ההמתנה, ולכן Operation C מודפסת לפני התוצאה.then, וכישלון ב-catch.async ו-await.הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על Promise» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז כעת, אחרי שראינו איך אנחנו כן יכולים להריץ קוד אסינכרוני ב-Node.js, בואו נראה איך אנחנו יכולים לעשות את זה עם משהו שנקרא promise. אז קודם כל, מה זה promise באנגלית?
promise זה הבטחה. למה האובייקט הזה נקרא promise? כי האובייקט הזה אומר, תקשיבו, אל תשלחו לי שתי פונקציות לכאן, אני אחזיר לכם מהפונקציה אובייקט promise, ואני מבטיח לכם שהוא ידווח לכם או הצלחה או כישלון, ואז תיתנו את שתי הפונקציות האלה לאובייקט פרומיס עצמו ולא לפונקציה המקורית.
אז זה נראה כאילו שלא הרווחנו שום דבר, אבל כן, תכף אנחנו נראה שיש פה כמה יתרונות. אז יש לנו פה את הקטע קוד הראשון שהוא סינכרוני לחלוטין, הוא לא קשור לקוד הסינכרוני.
אנחנו הולכים לקטע קוד השני, do work a sync, ואנחנו רוצים לדווח את הסכום הזה ואנחנו רוצים לקחת את כל הפונקציה הזאת ולשנות אותה לפונקציה שעובדת עם promise.
אז מה שנעשה זה פשוט נקרא לה do work async 1 גם כאן וגם כאן בכדי שהקוד הזה יישאר אצלנו בדוגמה ונוכל אחר כך אולי להשוות את שני הקודים ואנחנו רוצים לכתוב את אותה הפונקציה בדיוק פה, אבל נקרא לה doWorkAsync2.
הנה doWorkAsync2, תכף אנחנו נכתוב אותה, בינתיים בואו נחשוף אותה החוצה. את הקטע קוד הזה אנחנו רוצים לשים בהערה, כי אנחנו לא רוצים להשתמש בו, אנחנו רוצים להשתמש תכף בפונקציה הזאת.
ומה בעצם אנחנו צריכים לבצע? אז קודם כל פונקציה בשביל לעבוד היא צריכה לקבל כל מיני ארגומנטים. אז הנה הפונקציה הראשונה, קיבלנו את fixed.
זה ארגומנט שהיא צריכה בשביל לעבוד. את שתי הפונקציות האלה היא קיבלה בתור ארגומנטים כי היא פונקציה אסינכרונית, והיא רצתה לדווח לנו או כישלון או הצלחה, וזה מה שה-promise בא לחסוך בפונקציה המקורית, בחתימה ליתר דיוק הראשונה.
ולכן אם אני רוצה פונקציה זהה שמקבלת כמה ספרות אחרי הנקודה אני רוצה, אז אני חייב גם את זה לקבל. אבל אני לא מקבל שום דבר מעבר לזה.
מה שאני עושה, אני מחזיר new promise. אז קודם כל, הפונקציה הראשונה לא החזירה שום דבר. לא היה לה return מתוך הפונקציה הזאת.
והפונקציה שאנחנו רוצים לעבוד עם promise מחזירה אובייקט promise. אובייקט ה-promise הוא זה שמקבל לסוגריים שלו את שני החבר'ה האלה.
בואו נעתיק אותם. נדביק אותם או אבל זה כפונקציה בצורה כזאת, זאת אומרת שאובייקט הפרומיס מקבל לקונסטרקטור שלו לסוגריים פונקציה אחת, פונקציה אחת שמקבלת שני ארגומנטים ואלו שני הארגומנטים של ה-success או ליתר דיוק ה-error callback וה-success callback. האמת הארגומנט
הראשון כאן אמור להיות הוא Success, הארגומנט השני אמור להיות Error, ככה זה עובד בפרומיס, ככה זה עובד ב-Node.js, ככה זה עובד בפרומיס.
בנוסף, מה שמקובל לעשות בפרומיס, פה רק אני צריך שתיים אני רואה, מה שמקובל, ולא לקרוא לזה Success Callback ו-Error Callback, אלא לקרוא לזה Resolve ו-Reject, ורק שמות של ארגומנטים.
resolve זה ה-success callback ו-reject זה ה-error callback. עכשיו את הקוד שלנו אנחנו עושים בתוך ה-promise. איזה קוד מקודם עשינו? את כל הקוד הזה.
בואו פשוט נעשה copy-paste של כל זה לפה. זאת אומרת שרק המבנה עצמו הוא טיפה שונה. הפונקציה לא מקבלת את ה-success או את ה-error callbacks, רק את הארגומנטים שהיא צריכה מחזירה לנו אובייקט פרומיס שהוא מכיל איזושהי פונקציה שהיא זאת שמקבלת את הסקסס ואת האירו קולבקס ופה מתבצע הקוד של הפרומיס.
עכשיו איך אנחנו משתמשים בזה הרי הקוד הזה הוא כבר לא אותו קוד מפני שהפונקציה הראשונה מחזירה אובייקט פרומיס לא קיבלנו פה שום דבר אז בואו נעשה בדיוק את אותו הדבר עם שימוש בפרומיס, נעשה פה אולי איזשהו תיעוד, זה סינק קוד וזה אסינק אסינק קוד טרו קולבקס ולבסוף
יש לנו אסינק קוד טרו פרומיס. אורייט, החלנו את אופרשן A, כעת אנחנו רוצים לגשת לדו וורק, זה בעצם long calculation.doworktime, ואם אני פותח סוגריים, מה אני בעצם רואה? שאני צריך לשלוח רק את ה-fixed.
זאת אומרת, כמה ספרות אחרי הנקודה אני רוצה שהוא יביא לי. בואו נשלח כרגע 5. אבל הפונקציה מחזירה לי promise. לכאן מוחזר object promise.
אז אם מוחזר לפה object, אנחנו יכולים ללחוץ נקודה. ולהגיע לשתי פונקציות, then וcatch. then זה פונקציה שאנחנו שולחים אליה את הפונקציה של ההצלחה זאת וcatch זה פונקציה שאנחנו שולחים אליה את ה-Kישלון את זאת בואו נעשה את זה דרך אגב הרבה פעמים פשוט יורדים פה שורה בשביל לראות את הכל בשורה אחת כלומר אחד מתחת לשני יש לנו כאן קודם כל את הפונקציה
של ההצלחה אני פשוט אעשה copy paste שלה מפה עד לפה copy paste אני אוריד רק את ההערות האלה ויש לנו מיד אחר כך שוב פעם הוא מחזיר הפונקציה