Menu
CoddyTech

Async ו-Await

חלק מהיחידה יסודות Node.js במסלול ה-Node.js של Coddy. שיעור 23 מתוך 33.

שרשרת של קריאות .then נקראת אחרת מהאופן שבו חושבים על השלבים: לקרוא, אחר כך לנתח, ואז לשמור.

בתוך פונקציית async, ‏await משהה את הביצוע עד שההבטחה מתממשת או נכשלת, ומחזיר לך את הערך שלה. הבטחה שנכשלה זורקת שגיאה שם, ולכן try ו-catch מטפלים בה. במודול, await פועל גם ברמה העליונה.

import { readFile } from 'node:fs/promises';

const loadConfig = async () => {
    try {
        return JSON.parse(await readFile('config.json', 'utf8'));
    } catch {
        return {};
    }
};

const config = await loadConfig();
console.log(config.port ?? 3000);

פונקציית async תמיד מחזירה הבטחה, ולכן גם מי שקורא לה צריך להשתמש ב-await. שוכחים await ומקבלים את ההבטחה עצמה, Promise { <pending> }, במקום את הערך שלה.

challenge icon

אתגר

קל

בשלב הזה נפתח פרויקט של כלי שורת הפקודה להערות שהוכן עבור הקורס, ולא את קובצי הפרויקט שלך מ־Promises (כולל count.js). העבודה הקודמת שלך נשארת בשיעור שלה. קרא את הקבצים שסופקו לפני עריכת store.js. העותק הזה כולל קורא הערות המבוסס על promises וטיפול בשגיאות.

store.js משתמש עכשיו בגרסאות ה־promise של readFile ו־writeFile, והשיטות שלו הן async. אבל עדיין אין המתנה ל־promises, ולכן כל פקודה נכשלת. הוסף await בכל מקום שבו promise חייב להסתיים לפני השלב הבא.

  1. ב־store.js, בתוך load, המתן לסיום readFile לפני ש־JSON.parse משתמש בטקסט.
  2. ב־store.js, load היא async, ולכן היא מחזירה promise. המתן לה במקום שבו החנות מגדירה את notes. מודול יכול להשתמש ב־await ברמה העליונה, מחוץ לכל פונקציה.
  3. ב־store.js, המתן לסיום writeFile בתוך save, והמתן לסיום this.save() בתוך add ובתוך remove.
  4. ב־notes.js, store.add ו־store.remove הן עכשיו async. המתן להן בענפים add ו־done, כדי ש־n ו־removed יכילו ערכים ולא promises.

בסך הכול, צריך להוסיף שבע פקודות await. לאחר מכן, כל הפקודות יפעלו כמו קודם. list מציגה את ההערות שב־notes.json. עם שתי ההערות ההתחלתיות, add Buy bread מדפיסה Saved note 3., ולאחר מכן done 1 מדפיסה Done: Buy milk.

נסה זאת: הקלד list בתיבה אחרי $ node notes.js לפני שתשנה משהו. תראה notes.json is damaged: ..., אבל הקובץ תקין: JSON.parse קיבלה promise במקום את הטקסט שבקובץ. אחרי השינויים שלך, list תציג שוב את ההערות. לאחר מכן הקלד add Buy bread וראה את Saved note 3.. הקלד done 1 וראה את Done: Buy milk.

נסו בעצמכם

import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';

const file = 'notes.json';

// readFile ו־writeFile מחזירות כעת הבטחות. יש להמתין לכל אחת מהן באמצעות await.
const load = async () => {
    if (!existsSync(file)) {
        return [];
    }
    try {
        return JSON.parse(readFile(file, 'utf8'));
    } catch (err) {
        console.error(`notes.json is damaged: ${err.message}`);
        process.exit(1);
    }
};

const store = {
    notes: load(),
    async save() {
        writeFile(file, JSON.stringify(this.notes, null, 2));
    },
    async add(text) {
        this.notes.push(text);
        this.save();
        return this.notes.length;
    },
    async remove(n) {
        const [text] = this.notes.splice(n - 1, 1);
        this.save();
        return text;
    },
};

export default store;
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה יסודות Node.js

תרגלו בעצמכם: Express אונליין