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'),
]);استخدمها عندما لا تعتمد عمليتا القراءة إحداهما على الأخرى. وعندما تحتاج الثانية إلى نتيجة الأولى، فانتظرهما واحدة تلو الأخرى.
التحدي
سهل- يقرأ
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;