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> }, במקום את הערך שלה.
אתגר
קלבשלב הזה נפתח פרויקט של כלי שורת הפקודה להערות שהוכן עבור הקורס, ולא את קובצי הפרויקט שלך מ־Promises (כולל count.js). העבודה הקודמת שלך נשארת בשיעור שלה. קרא את הקבצים שסופקו לפני עריכת store.js. העותק הזה כולל קורא הערות המבוסס על promises וטיפול בשגיאות.
store.js משתמש עכשיו בגרסאות ה־promise של readFile ו־writeFile, והשיטות שלו הן async. אבל עדיין אין המתנה ל־promises, ולכן כל פקודה נכשלת. הוסף await בכל מקום שבו promise חייב להסתיים לפני השלב הבא.
- ב־
store.js, בתוךload, המתן לסיוםreadFileלפני ש־JSON.parseמשתמש בטקסט. - ב־
store.js,loadהיאasync, ולכן היא מחזירה promise. המתן לה במקום שבו החנות מגדירה אתnotes. מודול יכול להשתמש ב־awaitברמה העליונה, מחוץ לכל פונקציה. - ב־
store.js, המתן לסיוםwriteFileבתוךsave, והמתן לסיוםthis.save()בתוךaddובתוךremove. - ב־
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;
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות Node.js
1הרצת JavaScript ב-Node
שלום, Nodeקריאת הפקודהארגומנטים של שורת הפקודהפקודותתרגלו בעצמכם: Express אונליין