Promise.all
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 25 من 33.
يمكن لعمليات القراءة المستقلة أن توفّر أجزاءً مختلفة من نتيجة واحدة. ابدأ العمليتين، وانتظر نتائجهما، ثم استخدم كل نتيجة للغرض الخاص بها.
const [forecast, location] = await Promise.all([
readFile('forecast.txt', 'utf8'),
readFile('location.txt', 'utf8'),
]);
console.log(location + ': ' + forecast);يتبع ترتيب النتائج ترتيب مصفوفة الإدخال، حتى إذا اكتملت القراءة الثانية أولًا. تقرأ أداة الملاحظات لديك الملاحظات وإعداد العرض بدلًا من ذلك. يتولى المساعد readJson المُعَدّ التعامل مع الملفات المفقودة والتالفة. نسّق أرقام الملاحظات قبل عكس ترتيب أسطر العرض، حتى لا يغيّر تبديل طريقة العرض الملاحظة التي يشير إليها الرقم.
التحدي
سهلتفتح هذه الخطوة مشروع أداة سطر الأوامر للملاحظات المُعدّة للدورة، وليس ملفات مشروعك من درس Async and Await (بما فيها store.js). يبقى عملك السابق في درسه الخاص. اقرأ الملفات المقدمة قبل تعديل store.js. تتضمن هذه النسخة أوامر الملاحظات، وقارئ JSON، وملف الإعدادات.
تحتاج أداة الملاحظات الآن إلى كلٍّ من notes.json وsettings.json. وتحافظ الدالة المساعدة readJson(name, fallback) المقدمة معها على معالجة أخطاء الملفات الحالية.
- في
store.js، استبدل العناصر النائبة الفارغة بنتائج قراءة الملفين معًا باستخدامPromise.all. إذا كان ملف الملاحظات مفقودًا، فاستخدم[]؛ وإذا كانت الإعدادات مفقودة، فاستخدم{}. - في
notes.js، يُنشئ فرعlistأسطرًا مرقمة بالفعل. عندما تكون قيمةstore.settings.sortهيnewest، اعكس ترتيب هذه الأسطر قبل طباعتها. أما أي إعداد آخر، فيُبقي الترتيب الأصلي.
جرّب list: بعد Notes for you، توقّع ظهور 2. Call Ada ثم 1. Buy milk. غيّر الإعداد إلى oldest وجرّب مرة أخرى: ستظهر الأرقام نفسها بترتيب تصاعدي. أعد الإعداد إلى newest قبل التحقق.
جرّب بنفسك
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
const readJson = async (name, fallback) => {
if (!existsSync(name)) {
return fallback;
}
try {
return JSON.parse(await readFile(name, 'utf8'));
} catch (err) {
console.error(`${name} is damaged: ${err.message}`);
process.exit(1);
}
};
// استبدل هذه العناصر النائبة بنتيجتي readJson.
const notes = [];
const settings = {};
const store = {
notes,
settings,
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
1تشغيل JavaScript على Node
مرحبًا يا Nodeقراءة الأمروسائط سطر الأوامرالأوامر4البرمجة غير المتزامنة في Node
استخدام نتيجة دالة الاستدعاءدوال الاستدعاءنتيجة Promiseعندما يفشل Promiseالوعودانتظار قيمةAsync وAwaitقراءتان مستقلتانPromise.allحلقة الأحداثالمؤقتاتتدرّب بنفسك: Playground لـ Express