Menu
CoddyTech

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 обрабатывает отсутствующие и повреждённые файлы. Форматируйте номера заметок перед тем, как менять порядок строк отображения, чтобы смена вида никогда не меняла, какую заметку обозначает номер.

challenge icon

Задание

Легко

На этом шаге открывается подготовленный для курса проект инструмента командной строки для работы с заметками, а не файлы проекта из урока Async and Await (включая store.js). Предыдущая работа остаётся в своём уроке. Прежде чем редактировать store.js, прочитай предоставленные файлы. В этой копии есть команды для работы с заметками, считыватель JSON и файл конфигурации.

Теперь инструменту для работы с заметками нужны оба файла: notes.json и settings.json. Предоставленный вспомогательный метод readJson(name, fallback) сохраняет существующую обработку ошибок файлов.

  1. В store.js замени пустые заглушки результатами чтения обоих файлов с помощью Promise.all. Если файл заметок отсутствует, используй []; если отсутствуют настройки — {}.
  2. В ветке list файла notes.js уже формируются пронумерованные строки. Если значение 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

Потренируйтесь самостоятельно: Песочница Express