← Назад к вопросам

Как работают параметры метод then?

2.0 Middle🔥 141 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Параметры метода then() в Promise

Метод then() - основной способ работы с результатами Promise. Он принимает два необязательных параметра: обработчик успеха и обработчик ошибки. Понимание их работы критично для асинхронного программирования.

Основная синтаксис

const promise = fetch('/api/data');

// then имеет два параметра
promise.then(
  (value) => { /* обработчик успеха */ },
  (error) => { /* обработчик ошибки */ }
);

// Параметры:
// 1. onFulfilled (успех) - функция, вызовется если Promise выполнился успешно
// 2. onRejected (ошибка) - функция, вызовется если Promise был отклонен

Обработчик успеха (onFulfilled)

const promise = Promise.resolve('Данные получены!');

// onFulfilled вызывается с результатом
promise.then((value) => {
  console.log(value); // "Данные получены!"
});

// Практический пример с fetch
fetch('/api/v1/users')
  .then((response) => {
    console.log('Статус:', response.status);
    return response.json(); // Возвращаем новый Promise
  })
  .then((data) => {
    console.log('Пользователи:', data);
  });

// Обработчик может вернуть:
// 1. Значение - перейдет в следующий then
// 2. Promise - дождется разрешения Promise
// 3. Ничего (undefined) - передаст undefined в следующий then

Обработчик ошибки (onRejected)

const badPromise = Promise.reject('Ошибка сервера');

// onRejected вызывается с причиной отклонения
badPromise.then(
  null, // нет обработчика успеха
  (error) => {
    console.error('Ошибка:', error); // "Ошибка сервера"
  }
);

// Или использовать catch
badPromise.catch((error) => {
  console.error('Перехвачена ошибка:', error);
});

// Практический пример
fetch('/api/v1/data')
  .then(
    (response) => response.json(),
    (networkError) => {
      console.error('Сетевая ошибка:', networkError);
      throw new Error('Не удалось подключиться к серверу');
    }
  )
  .catch((error) => {
    console.error('Обработана ошибка:', error);
  });

Цепочка then()

fetch('/api/v1/users/1')
  .then((response) => response.json())      // Параметр 1
  .then((user) => {                          // Параметр результата из предыдущего
    console.log('Пользователь:', user);
    return fetch(`/api/v1/posts/${user.id}`);
  })
  .then((response) => response.json())       // Параметр из fetch
  .then((posts) => {                         // Параметр постов
    console.log('Посты:', posts);
  })
  .catch((error) => {                        // Ловит ошибку из любого then
    console.error('Что-то пошло не так:', error);
  });

// Каждый then получает результат предыдущего
// Если ошибка - она пройдет по цепочке до catch

Игнорирование параметров

const promise = Promise.resolve({ name: 'John', age: 30 });

// Можно вызвать then с одним параметром
promise.then((data) => {
  console.log('Успех:', data);
});

// Или вообще без параметров для side effects
promise.then(() => {
  console.log('Promise разрешен'); // параметр не используется
});

// Старый паттерн - then с двумя параметрами
promise.then(
  (data) => console.log('Успех:', data),
  (error) => console.error('Ошибка:', error)
);

// Современный паттерн - отдельные then/catch
promise
  .then((data) => console.log('Успех:', data))
  .catch((error) => console.error('Ошибка:', error));

Возвращаемые значения

const promise = Promise.resolve(10);

// Возврат значения
promise
  .then((value) => {
    console.log('Получено:', value); // 10
    return value * 2; // Возвращаем число
  })
  .then((doubled) => {
    console.log('Удвоено:', doubled); // 20
  });

// Возврат Promise
promise
  .then((value) => {
    return new Promise((resolve) => {
      setTimeout(() => resolve(value + 100), 1000);
    });
  })
  .then((result) => {
    console.log('Результат:', result); // 110 (после 1 сек)
  });

// Возврат undefined
promise
  .then((value) => {
    console.log('Значение:', value);
    // ничего не возвращаем
  })
  .then((result) => {
    console.log('Результат:', result); // undefined
  });

Обработка ошибок

fetch('/api/data')
  .then(
    (response) => {
      if (!response.ok) {
        throw new Error(`HTTP ${response.status}`);
      }
      return response.json();
    },
    (networkError) => {
      console.error('Сетевая ошибка:', networkError);
      // Обработка сетевой ошибки
    }
  )
  .then(
    (data) => console.log('Данные:', data),
    (error) => console.error('Ошибка парсинга:', error)
  );

// Важно: then с двумя параметрами не ловит ошибки из первого параметра
// Поэтому лучше использовать catch

fetch('/api/data')
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error('Любая ошибка:', error));

then() vs async/await

// then() - классический способ
function getUser(id) {
  return fetch(`/api/v1/users/${id}`)
    .then((response) => response.json())
    .then((user) => {
      console.log('Пользователь:', user);
      return user;
    })
    .catch((error) => {
      console.error('Ошибка:', error);
    });
}

// async/await - современный способ (работает с Promise)
async function getUser(id) {
  try {
    const response = await fetch(`/api/v1/users/${id}`);
    const user = await response.json();
    console.log('Пользователь:', user);
    return user;
  } catch (error) {
    console.error('Ошибка:', error);
  }
}

// Оба способа работают с Promise одинаково

They параметры then() - это мощный механизм для работы с асинхронным кодом. Современные приложения часто используют async/await, но понимание then() остается важным.

Как работают параметры метод then? | PrepBro