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