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;
Все уроки раздела Основы Node.js
1Запуск JavaScript в Node
Знакомство с NodeАргументы командной строкиКоманды