Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: async, promise, error handling, catch, JavaScript

4444

Вопрос проверяет понимание принципов работы с асинхронным кодом в JavaScript, в частности, как обрабатываются ошибки в цепочках промисов, что критично для создания стабильных приложений.

Короткий ответ

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

Длинный ответ

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

Как работает обработка ошибок в промисах

Каждый промис предоставляет методы .then() для обработки успешного результата и .catch() для обработки ошибок. Если в процессе выполнения промиса или в колбэке .then() возникает исключение (например, выбрасывается ошибка или возвращается отклонённый промис), управление передаётся ближайшему обработчику .catch() в цепочке. Если такого обработчика нет, ошибка становится "необработанной" (unhandled rejection), что в современных средах выполнения может привести к завершению процесса.

Практический пример

Рассмотрим пример, где мы пытаемся получить данные пользователя, обработать их и сохранить. На каждом этапе возможны ошибки.

function fetchUserData(userId) {
  // Имитируем асинхронный запрос
  return new Promise((resolve, reject) => {
    if (!userId) {
      reject(new Error('Invalid user ID'));
    }
    setTimeout(() => resolve({ id: userId, name: 'John' }), 100);
  });
}

fetchUserData(123)
  .then(user => {
    console.log('User fetched:', user);
    // Предположим, здесь происходит ошибка
    if (!user.email) {
      throw new Error('Email not found'); // Эта ошибка будет поймана .catch()
    }
    return user;
  })
  .then(user => {
    // Этот блок не выполнится, если выше была ошибка
    console.log('Processing user:', user.name);
  })
  .catch(error => {
    // Перехватываем ЛЮБУЮ ошибку в цепочке выше
    console.error('An error occurred:', error.message);
    // Возвращаем значение по умолчанию, чтобы цепочка могла продолжиться
    return { id: 0, name: 'Guest' };
  })
  .then(finalResult => {
    // Выполнится после .catch(), получит объект гостя
    console.log('Final result:', finalResult);
  });

В этом примере, если userId не передан, промис сразу отклоняется. Если пользователь получен, но у него нет email, мы выбрасываем ошибку в первом .then(). Оба сценария будут перехвачены блоком .catch(), который логирует ошибку и возвращает объект-заглушку, позволяя цепочке безопасно продолжиться до последнего .then().

Где это применяется

Обработка ошибок в цепочках промисов повсеместно используется при:

  • Работе с API (сетевые запросы через fetch или axios).
  • Чтении файлов в Node.js.
  • Выполнении последовательных асинхронных операций в базах данных.
  • Любых сценариях, где необходимо гарантировать, что сбой одной операции не "положит" всё приложение.

Вывод: Всегда завершайте цепочки промисов блоком .catch() для обработки возможных ошибок. Это особенно важно в продакшн-коде, чтобы приложение могло грациозно восстанавливаться после сбоев, предоставлять пользователям понятные сообщения и вести логи для отладки.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#async

#promise

#error handling

#catch

#JavaScript

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию