JS: исключения, асинхронные функции
JavaScript: исключения, асинхронные функции
Цель: изучить работу с таймерами, замыкания, асинхронными функциями, исключениями и модулями ESM.
Порядок выполнения лабораторной работы:
- Изучить:
- функции обратного вызова, подход callback-last error-first,
- таймеры: setTimeout, setInterval, clearInterval,
- замыкания и принцип их работы,
- async/await,
- throw ‘Error’ и throw new Error(‘Error’),
- try/catch/finally,
- import/export.
- Для выполнения работы необходимо:
- В репозитории, переключиться на ветку main, создать ветку lab2, переключиться на нее и далее работать на ней.
- Решить предложенные задачи используя JS в нескольких файлах (main.js, callbacks.js, tasks.js). В main.js вы импортируете все написанные функции и используете их, в callbacks.js реализуете только функции обратного вызова и экспортируете их, в tasks.js реализуете функции, имена которых даны в начале каждой задачи и экспортируете их.
- Проверить выполнение всех заданий в среде Node.js.
- Зафиксировать результаты работы с помощью системы контроля версий git и отправить ветку lab2 в репозиторий на github.
Требования к JS:
- Код отформатирован, не содержит ошибок и замечаний от статического анализа кода ESLint, сохранен в системе контроля версий.
- Все задачи имеют решение и требуемый в них вывод.
- Отсутствуют ошибки в консоли.
Источники
- «Современный учебник JavaScript»
- doka.guide
- Руководство по JavaScript на русском
- Марейн Хавербек «Выразительный Javascript»
- Глубокое погружение в ES-модули в картинках
Задачи
Корень из числа
Напишите функцию 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, куда отправлено письмо.
Вопросы для защиты
- Функции обратного вызова (callback function). Идея callback-last / error-first.
- Таймеры в JS.
- Замыкание и примеры использования.
- Асинхронные функции и синтаксис async/await.
- throw и ход исполнения кода.
- Блоки try/catch/finally.
- ES модули, import/export, замыкание в модулях.