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, создать и переключиться на ветку lab3 и далее работать в ней.
    • Решить предложенные задачи используя JS в нескольких файлах (main.js, callbacks.js, tasks.js). В main.js вы импортируете все написанные функции и используете их, в callbacks.js реализуете только функции обратного вызова и экспортируете их, в tasks.js для экспорта функций, имена которых даны в начале каждой задачи.
    • Проверить выполнение всех заданий в среде Node.js.
    • Зафиксировать результаты работы с помощью системы контроля версий git и отправить ветку lab3 в репозиторий на github.

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

  • Все задачи имеют решение и требуемый в них вывод.
  • Отсутствуют ошибки в консоли.

Источники

Задачи

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

Напишите функцию 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 < 0.5) создайте объект userData, содержащий такие данные, как идентификатор пользователя, имя пользователя и адрес электронной почты.

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

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

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

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

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

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

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

  1. Что такое функция обратного вызова (callback function)?
  2. В чем заключается идея callback-last, error-first подхода в функциях обратного вызова?
  3. Как можно создавать и очищать таймеры в JS?
  4. Что такое замыкание?
  5. Что такое асинхронная функция?
  6. Как используется синтаксис async/await?
  7. Для чего используется throw и как он влияет на ход исполнения кода?
  8. Что происходит если выброшенное исключение нигде не обрабатывается?
  9. Как работает блок try/catch/finally с исключениями? В каком порядке срабатывают эти блоки?
  10. Как используются import/export для разделения кода на модули?