> Как работать с Promise в цепочках (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Kodix, GoInvest

Стек: JavaScript

> Пример ответа

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

Promise-цепочки - это последовательная обработка асинхронных операций через .then(), где каждый следующий шаг получает результат предыдущего. Ключевые правила: всегда возвращать Promise из .then(), обрабатывать ошибки через .catch() в конце цепочки, избегать вложенности и использовать Promise.all/Promise.allSettled для параллельных задач. Цепочки делают код линейным и читаемым, заменяя callback hell.

Подробное объяснение

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

  • Возврат значения: если .then() возвращает примитив, следующий .then() получит его как аргумент. Если возвращается Promise, цепочка дожидается его разрешения.
  • Обработка ошибок: ошибка в любом звене цепочки передаётся в ближайший .catch(). Если .catch() возвращает значение, цепочка продолжается - это позволяет делать fallback.
  • Проглатывание ошибок: если в .then() не вернуть Promise или не пробросить ошибку, цепочка может "молча" потерять ошибку.
  • Параллельность: для независимых операций лучше использовать Promise.all, чтобы не растягивать время выполнения.
  • Побочные эффекты: .then() можно использовать для логирования или сайд-эффектов, но нужно помнить, что он всегда создаёт новый Promise.

На практике

В реальном коде цепочки применяются для:

  • последовательных API-запросов, где следующий зависит от предыдущего (например, получить пользователя, затем его посты);
  • обработки данных после асинхронной загрузки;
  • построения конвейеров трансформации данных.

Практические рекомендации:

  • всегда возвращайте Promise из .then(), если планируете продолжать цепочку;
  • ставьте .catch() в конце цепочки, а не после каждого шага - это централизует обработку ошибок;
  • используйте async/await для сложных цепочек - это синтаксический сахар над Promise, который делает код ещё читаемее;
  • для параллельных независимых задач не создавайте цепочку, а используйте Promise.all.

Пример кода

JAVASCRIPT
// Последовательные запросы
fetchUser(1)
.then(user => fetchPosts(user.id))
.then(posts => {
console.log(posts);
return posts.length;
})
.then(count => {
console.log(`Total posts: ${count}`);
})
.catch(error => {
console.error('Something failed:', error);
});
// Fallback при ошибке
fetchConfig()
.catch(() => ({ theme: 'default' }))
.then(config => applyTheme(config));
// Параллельные задачи
Promise.all([fetchUser(1), fetchUser(2)])
.then(([user1, user2]) => {
console.log(user1, user2);
});

Как отвечать на собеседовании

Начните с определения цепочки и её назначения. Затем объясните механику: каждый .then() возвращает новый Promise, что позволяет строить последовательность. Упомяните, как работает передача значений и ошибок. Приведите пример из практики - например, последовательные запросы. Если спросят про альтернативы, скажите про async/await и Promise.all. Покажите понимание edge cases: что будет, если не вернуть Promise из .then(), как работает .catch() в середине цепочки.

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание асинхронности и event loop;
  • умение строить читаемые цепочки без вложенности;
  • знание механики передачи значений и ошибок;
  • способность выбирать между последовательным и параллельным выполнением;
  • знание современных альтернатив (async/await).

Типичные ошибки

  • Забытый return: если не вернуть Promise из .then(), следующий шаг получит undefined или выполнится раньше времени.
  • Вложенные цепочки: создание "пирамиды" из .then() внутри .then() - это антипаттерн, который убивает читаемость.
  • Ошибка без .catch(): необработанный rejection в цепочке приводит к падению приложения или тихому игнорированию.
  • Использование цепочки для параллельных задач: последовательное выполнение независимых операций замедляет код.
  • Проглатывание ошибок в .catch(): если .catch() не возвращает значение и не пробрасывает ошибку, цепочка продолжается с undefined, что может скрыть проблему.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью