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