Menu
CoddyTech

Promise.all

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

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

Promise.all([a, b]) מאפשרת לשתי ההבטחות לרוץ בו-זמנית וממתינה עד ששתיהן מסתיימות. היא מחזירה את התוצאות שלהן באותו סדר כמו במערך, ונכשלת ברגע שאחת מהן נכשלת.

const [user, prefs] = await Promise.all([
    readFile('user.json', 'utf8'),
    readFile('prefs.json', 'utf8'),
]);

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

challenge icon

אתגר

קל
  • store.js קורא את notes.json ואת settings.json בו־זמנית באמצעות Promise.all. קובץ הגדרות חסר נחשב ל־{}.
  • כאשר settings.json מכיל "sort": "newest", הפקודה list מציגה תחילה את ההערה החדשה ביותר. המספר של כל הערה נשמר.

הריצו את node notes.js list. לאחר מכן שנו את newest ל־oldest בתוך settings.json והריצו שוב.

נסו בעצמכם

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

const file = 'notes.json';

const load = async () => {
    if (!existsSync(file)) {
        return [];
    }
    try {
        return JSON.parse(await readFile(file, 'utf8'));
    } catch (err) {
        console.error(`notes.json is damaged: ${err.message}`);
        process.exit(1);
    }
};

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

export default store;

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