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;