Menu
CoddyTech

Промисы

Часть раздела Основы Node.js путешествия по Node.js на Coddy. Урок 21 из 33.

За обратными вызовами внутри обратных вызовов трудно следить, и в каждом нужно проверять err.

node:fs/promises возвращает промис: объект, представляющий результат, который появится позже. .then(fn) выполняется с результатом, .catch(fn) выполняется, если любой предшествующий шаг завершился ошибкой, а .finally(fn) выполняется в любом случае.

import { readFile } from 'node:fs/promises';

readFile('poem.txt', 'utf8')
    .then((text) => console.log(text.length + ' characters'))
    .catch(() => console.log('No poem today'))
    .finally(() => console.log('Bye'));

Ошибка, выброшенная внутри .then, тоже попадает в .catch, поэтому одного обработчика достаточно и для чтения, и для разбора. Промис, завершившийся ошибкой без .catch, приводит к аварийному завершению программы.

challenge icon

Задание

Легко

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

  • Перепишите count.js, используя readFile из node:fs/promises и .then.
  • Теперь при отсутствии файла выводится No notes yet с помощью .catch.
  • Done по-прежнему выводится последним с помощью .finally.

Выполните node count.js, затем node count.js nothere.json.

Без аргумента выводятся Reading..., 2 notes, а затем Done, каждое сообщение на отдельной строке. При указании nothere.json средняя строка — No notes yet.

Попробуйте сами

import fs from 'node:fs';

const file = process.argv[2] ?? 'notes.json';

console.log('Reading...');
fs.readFile(file, 'utf8', (err, text) => {
    if (err) {
        console.log(`Cannot read ${file}`);
    } else {
        console.log(`${JSON.parse(text).length} notes`);
    }
    console.log('Done');
});

Все уроки раздела Основы Node.js

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