דף הבית » קידוד » תחילת העבודה עם הבטחות

    תחילת העבודה עם הבטחות

    קוד אסינכרוני הוא שימושי לביצוע משימות שהן דורש זמן רב אבל, כמובן, זה לא נטול חסרונות. משתמש בקוד Async פונקציות התקשרות כדי לעבד את התוצאות שלה, אולם פונקציות התקשרות לא ניתן להחזיר ערכים כי פונקציות JavaScript אופייני יכול.

    לכן, הם לא רק לקחת את היכולת שלנו לשלוט ביצוע הפונקציה אלא גם לעשות טיפול בשגיאה קצת טרחה. זה המקום שבו הבטחה אובייקט מגיע, כפי שהוא שואף למלא חלק בורות בקידוד אסינכרוני.

    הבטחה היא טכנית אובייקט פנימי סטנדרטי ב- JavaScript, כלומר זה בא מובנה ל- JavaScript. הוא משמש לייצוג התוצאה הסופית של בלוק קוד אסינכרוני (או הסיבה מדוע הקוד נכשל) ויש לו שיטות לשלוט ביצוע הקוד האסינכרוני.

    תחביר

    אנחנו יכולים ליצור מופע של הבטחה אובייקט משתמש ב חדש מילת מפתח:

     הבטחה חדשה (פונקציה (פתרון, דחייה) ); 

    הפונקציה עבר כפרמטר אל ה מבטיח () הבנאי ידוע בשם מוציא להורג. הוא מכיל את הקוד האסינכרוני יש שני פרמטרים של פונקציה הקלד, מכונה לפתור ו דחה פונקציות (עוד על אלה בקרוב).

    ארצות הברית הבטחה אובייקט

    ה מצב התחלתי של הבטחה אובייקט נקרא ממתין ל. במצב זה, התוצאה של חישוב אסינכרוני לא קיים.

    מצב ההמתנה הראשוני משתנה מילא כאשר החישוב הוא מוצלח. ה תוצאה של החישוב זמין במצב זה.

    במקרה חישוב אסינכרוני נכשל, ה הבטחה מהלכים מתנגדים נדחה המדינה מן הראשונית שלה ממתין ל מדינה. במצב זה, הסיבה לכישלון החישוב (כלומר הודעת שגיאה) זמינה.

    כדי לעבור ממתין ל ל מילא מדינה, פתרון () נקרא. כדי לעבור ממתין ל ל נדחה מדינה, דחייה () נקרא.

    ה לאחר מכן ו לתפוס שיטות

    כאשר המדינה שינויים מ ממתין ל ל מילא, מטפל האירוע של הבטחה של אובייקט לאחר מכן שיטה מתבצע. וכאשר המדינה שינויים מ ממתין ל ל נדחה, מטפל האירוע של הבטחה של אובייקט לתפוס שיטה מתבצע.

    דוגמה 1

    “לא מבוקר” קוד

    נניח שיש hello.txt קובץ המכיל את “שלום” מילה. הנה איך אנחנו יכולים לכתוב בקשת AJAX ל אחזר את הקובץ ו להראות את תוכנו, ללא שימוש הבטחה אובייקט:

     function getTxt () let xhr = XMLHttpRequest חדש (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('טקסט / רגיל'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (this.response); לשבור; מאר 404: לזרוק 'קובץ לא נמצא'; ברירת מחדל: לזרוק 'נכשל לאחזר את הקובץ';  לתפוס (טעות) console.log (err);  getTxt (); 

    אם התוכן של הקובץ היה בהצלחה, כלומר. קוד מצב התגובה הוא 200, טקסט התגובה הוא שנכתב לתוך המסמך. אם הקובץ הוא לא נמצא (סטטוס 404), א “הקובץ לא נמצא” הודעת שגיאה נזרקת. אחרת, א הודעת שגיאה כללית המציין את הכישלון של הבאת הקובץ נזרק.

    “מובטחת” קוד

    עכשיו, בואו קידם את הקוד לעילYou

     הפונקציה getTxt () return new promise (פונקציה (פתרון, דחייה) let xhr = XMLHttpRequest חדש (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('טקסט / רגיל'); xl.send (); xhr.onload = function () switch (this.status) case 200: Resolution (this.response); case 404: דחה ('קובץ לא נמצא'); ברירת מחדל: דחה ('נכשל אחזר את הקובץ ');;);  gettxt () ולאחר מכן (function (txt) document.write (txt);) לתפוס (פונקציה (שגיאה) console.log (err);); 

    ה getTxt () הפונקציה מקודדת כעת לחזור מופע חדש של הבטחה אובייקט, ואת הפונקציה המבצעת שלה מחזיק קוד אסינכרוני מלפני.

    כאשר קוד מצב התגובה הוא 200, ה הבטחה J מילא על ידי קורא פתרון () (התגובה מועברת כפרמטר של פתרון ()). כאשר קוד המצב הוא 404 או אחר, הבטחה J נדחה באמצעות דחייה () (עם הודעת השגיאה המתאימה כפרמטר של דחייה ()).

    ה מטפלים באירועים עבור לאחר מכן() ו לתפוס() שיטות של ה הבטחה אובייקט נוסף בסוף.

    כאשר הבטחה J מילא, המטפל של לאחר מכן() השיטה מופעלת. טענתה היא הפרמטר עבר מ פתרון (). בתוך המטפל באירוע, טקסט התגובה (שהתקבל כארגומנט) הוא שנכתב לתוך המסמך.

    כאשר הבטחה J נדחה, מטפל האירוע של לתפוס() השיטה מופעלת, רישום השגיאה.

    ה יתרון עיקרי של הגרסה לעיל Promisified של הקוד הוא טיפול בשגיאה. במקום לזרוק חריגים Uncought סביב - כמו בגרסה הלא Promisified - הודעות כשל הולמות מוחזרים ומתחברים.

    אבל, זה לא רק חוזרים של ה הודעות כשל אלא גם של תוצאה של חישוב אסינכרוני זה יכול להיות מועיל באמת עבורנו. כדי לראות זאת, נצטרך להרחיב את הדוגמה שלנו.

    דוגמה 2

    “לא מבוקר” קוד

    במקום להציג את הטקסט hello.txt, אני רוצה לשלב את זה עם “העולם” מילה ולהציג אותו על המסך לאחר פסק זמן של 2 שניות. הנה הקוד שבו אני משתמש:

     function getTxt () let xhr = XMLHttpRequest חדש (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('טקסט / רגיל'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (concatTxt (this.response)); לשבור; מאר 404: לזרוק 'קובץ לא נמצא'; ברירת מחדל: לזרוק 'נכשל לאחזר את הקובץ';  לתפוס (טעות) console.log (err);  פונקציה concatTxt (מיל) setTimeout (function () return (res + 'World'), 2000);  getTxt (); 

    על קוד הסטטוס 200, concatTxt () הפונקציה נקראת לשרשר את טקסט התגובה עם “העולם” מילה לפני כתיבתו לתוך המסמך.

    אבל, קוד זה לא יעבוד לפי הצורך. ה setTimeout () פונקציית התקשרות לא ניתן להחזיר את המחרוזת המשורשרת. מה יודפס למסמך הוא לא מוגדר כי זה מה concatTxt () החזרות.

    “מובטחת” קוד

    אז, כדי להפוך את הקוד לעבוד, בואו קידם את הקוד לעיל, כולל concatTxt ()You

     הפונקציה getTxt () return new promise (פונקציה (פתרון, דחייה) let xhr = XMLHttpRequest חדש (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('טקסט / רגיל'); xl.send (); xhr.onload = function () switch (this.status) case 200: Resolution (this.response); case 404: דחה ('קובץ לא נמצא'); ברירת מחדל: דחה ('נכשל אחזר את הקובץ ');;);  פונקציה concatTxt (txt) return new Promise (פונקציה (דחייה, דחייה) setTimeout (function () solution (txt + 'World');, 2000);  getTxt () ולאחר מכן (txt) => return concatTxt (txt);) ולאחר מכן (txt) => document.write (txt);) לתפוס ((err) => console. log (err);); 

    בדיוק כמו getTxt (), ה concatTxt () גם פונקציה מחזירה חדשה הבטחה אובייקט במקום הטקסט המשורשר. ה הבטחה חזר על ידי concatTxt () J נפתרה בתוך פונקציית callback של setTimeout ().

    קרוב לסוף הקוד לעיל, המטפל באירוע של הראשון לאחר מכן() השיטה כאשר הבטחה of getTxt () J מילא, כלומר, כאשר הקובץ הוא אוחזר בהצלחה. בתוך המטפל, concatTxt () נקרא וה הבטחה חזר על ידי concatTxt () מוחזר.

    המטפל באירוע של השני לאחר מכן() השיטה כאשר הבטחה חזר על ידי concatTxt () J מילא, כלומר שתי שניות פסק זמן נגמרה ו פתרון () נקרא עם מחרוזת מחורצת כפרמטר שלה.

    סוף כל סוף, לתפוס() תופס את כל החריגים ומסרי הכישלון משני ההבטחות.

    בגירסה זו Promisified, “שלום עולם” מחרוזת תהיה הודפס בהצלחה אל המסמך.