Skip to content
Веб-разработка
GitHub

JS: исключения, асинхронные функции

JavaScript: исключения, асинхронные функции

Цель: изучить работу с таймерами, замыкания, асинхронными функциями, исключениями и модулями ESM.

Порядок выполнения лабораторной работы:

  1. Изучить:
    • функции обратного вызова, подход callback-last error-first,
    • таймеры: setTimeout, setInterval, clearInterval,
    • замыкания и принцип их работы,
    • async/await,
    • throw ‘Error’ и throw new Error(‘Error’),
    • try/catch/finally,
    • import/export.
  2. Для выполнения работы необходимо:
    • В репозитории, переключиться на ветку main, создать ветку lab2, переключиться на нее и далее работать на ней.
    • Решить предложенные задачи используя JS в нескольких файлах (main.js, callbacks.js, tasks.js). В main.js вы импортируете все написанные функции и используете их, в callbacks.js реализуете только функции обратного вызова и экспортируете их, в tasks.js реализуете функции, имена которых даны в начале каждой задачи и экспортируете их.
    • Проверить выполнение всех заданий в среде Node.js.
    • Зафиксировать результаты работы с помощью системы контроля версий git и отправить ветку lab2 в репозиторий на github.

Требования к JS:

  • Код отформатирован, не содержит ошибок и замечаний от статического анализа кода ESLint, сохранен в системе контроля версий.
  • Все задачи имеют решение и требуемый в них вывод.
  • Отсутствуют ошибки в консоли.

Источники

Задачи

Корень из числа

Напишите функцию calculateSquareRoot, которая принимает на вход число и выбрасывает исключение, если число отрицательное и возвращает корень в другом случае. Оберните вызов функции в блок try/catch. При нормальном поведении выведите результат в консоль, а в случае ошибки - сообщение исключения.

Счетчики

Напишите функцию createCounter, которая возвращает функцию, увеличивающую переменную счетчика при каждом вызове и возвращает обновленное значение этого счетчика. Протестируйте свою функцию, создав с помощью createCounter несколько счетчиков и несколько раз вызвав их. Для решения этой задачи потребуются замыкания.

Логгер

Напишите функцию периодического логгера periodicLogger, которая принимает сообщение и временной интервал в миллисекундах. Функция должна выводить в консоль через заданный интервал это сообщение. Внутри функции periodicLogger инициализируется переменная-счетчик count для отслеживания количества прошедших интервалов. setInterval используется для многократного выполнения функции обратного вызова, которая выводит сообщение и увеличивает переменную count. Используя замыкание внутри periodicLogger возвращается функция остановки. При вызове она очищает таймер интервалов (clearInterval), через указанное время в мс и выводит в консоль сообщение о количестве прошедших интервалов.

const stopLogger = periodicLogger("Сообщение", 1000);
setTimeout(stopLogger, 5000);

Пример вывода

Сообщение
Сообщение
Сообщение
Сообщение
Логгер остановлен после 4 интервалов.

Данные пользователя

Реализуйте асинхронную функцию getUserData (async/await), которая имитирует асинхронное извлечение данных о пользователе из базы данных. Функция должна принимать два параметра: userId (числовой идентификатор, представляющий пользователя) и callback (функция для обработки полученных данных пользователя или возможных ошибок).

Если userId не числовое значение, вызовите функцию обратного вызова с аргументами (error, null).

Внутри функции getUserData смоделируйте асинхронную выборку пользовательских данных с помощью setTimeout. После задержки в 1 секунду (имитирующей запрос к базе данных) с вероятностью 50% (используйте Math.random) создайте объект userData, содержащий такие данные, как идентификатор пользователя, имя пользователя и адрес электронной почты.

Как только пользовательские данные будут готовы, вызовите предоставленную функцию обратного вызова c аргументами (null, userData). Если во время асинхронной операции произошла ошибка, передайте ее в качестве первого аргумента в функцию обратного вызова (error, null).

Вызовите getUserData с примерным идентификатором пользователя (например, 123) и предоставьте функцию обратного вызова для обработки любых возможных ошибок или полученных пользовательских данных. В функции обратного вызова выведите данные о пользователе в консоль, если ошибка не произошла, или выведите сообщение об ошибке, если ошибка произошла.

Отправка почты

Напишите функцию sendEmail. Она имитирует отправку электронного письма. Ее параметры: объект (со свойствами emailAddress - адрес электронной почты получателя, subjeсt - тема письма, message - тело письма) и callback - функция, которая будет вызвана после завершения операции отправки письма через произвольный интервал времени (timeout). В функции обратного вызова первый параметр - это ошибка (если таковая имеется), а второй - результат операции.

Проверьте объект на наличие свойств с подходящими значениями. Если нет email или он не содержит символа ’@’, функция sendEmail должна вызвать функцию обратного вызова (error, null) с объектом ошибки, содержащим описательное сообщение. Если нет других свойств, то добавляете их с соответствующими значениями (“Без темы” и пустая строка для самого сообщения) и вызываете функцию обратного вызова с null в качестве первого аргумента и сообщением об успехе в качестве второго аргумента (null, email).

Функция обратного вывода должна вывести в консоль сообщение об ошибке. А если письмо отправлено успешно, то - сообщение об успехе и email, куда отправлено письмо.

Вопросы для защиты

  1. Функции обратного вызова (callback function). Идея callback-last / error-first.
  2. Таймеры в JS.
  3. Замыкание и примеры использования.
  4. Асинхронные функции и синтаксис async/await.
  5. throw и ход исполнения кода.
  6. Блоки try/catch/finally.
  7. ES модули, import/export, замыкание в модулях.