Menu
CoddyTech

Promises

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

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

node:fs/promises מחזיר במקום זאת הבטחה: אובייקט שמייצג תוצאה שתגיע בהמשך. .then(fn) מופעל עם התוצאה, .catch(fn) מופעל אם שלב כלשהו לפניו נכשל, ו-.finally(fn) מופעל בכל מקרה.

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

readFile('poem.txt', 'utf8')
    .then((text) => console.log(text.length + ' characters'))
    .catch(() => console.log('No poem today'))
    .finally(() => console.log('Bye'));

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

challenge icon

אתגר

קל

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

  • כתוב מחדש את count.js באמצעות readFile מ־node:fs/promises ו־.then.
  • כעת, אם קובץ חסר, יודפס No notes yet מתוך .catch.
  • Done עדיין מופיע אחרון, מתוך .finally.

הרץ node count.js, ואז node count.js nothere.json.

בלי ארגומנט, הפלט הוא Reading..., אחריו 2 notes, ואז Done, כל אחד בשורה נפרדת. עם nothere.json, השורה האמצעית היא No notes yet.

נסו בעצמכם

import fs from 'node:fs';

const file = process.argv[2] ?? 'notes.json';

console.log('Reading...');
fs.readFile(file, 'utf8', (err, text) => {
    if (err) {
        console.log(`Cannot read ${file}`);
    } else {
        console.log(`${JSON.parse(text).length} notes`);
    }
    console.log('Done');
});

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

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