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