Gernar
JavaScript: асинхронность

Какие аргументы принимает конструктор Promise

Разбор вопроса «Какие аргументы принимает конструктор Promise» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Какие аргументы принимает конструктор Promise

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет убедиться, что кандидат понимает базовый механизм работы Promise, включая его создание и управление состояниями. Также важно знание синтаксиса и роли resolve/reject.

Ключевые тезисы

  • Конструктор Promise принимает один аргумент — функцию-исполнитель (executor), которая вызывается сразу при создании промиса.
  • Функция-исполнитель принимает два параметра: resolve и reject — это колбэки для управления состоянием промиса.
  • resolve(value) — вызывается при успешном выполнении операции, переводит промис в состояние 'fulfilled' с результатом value.
  • reject(error) — вызывается при ошибке, переводит промис в состояние 'rejected' с указанной ошибкой error.

Подробный ответ

Конструктор Promise в JavaScript принимает один аргумент — функцию-исполнитель (executor), которая вызывается сразу при создании промиса. Эта функция получает два параметра: resolve и reject, которые являются колбэками для управления состоянием промиса. resolve(value) используется для успешного завершения промиса, переводит его в состояние 'fulfilled' с результатом value. reject(error) вызывается при ошибке, переводит промис в состояние 'rejected' с указанной ошибкой error. Если ни resolve, ни reject не вызываются, промис останется в состоянии 'pending' (ожидание) и не будет выполнен или отклонен. Исключение (throw) внутри функции-исполнителя автоматически вызовет reject с этим исключением в качестве ошибки. Promise.resolve() создает уже выполненный промис с переданным значением, в отличие от new Promise, который требует вызова resolve/reject.

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

Пример 1

Пример создания промиса с resolve:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Успех!'), 1000);
});
promise.then(result => console.log(result)); // 'Успех!'

Пример 2

Пример с reject и обработкой ошибки:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => reject(new Error('Ошибка!')), 1000);
});
promise.catch(error => console.error(error)); // Error: Ошибка!

Пример 3

Пример с невызванными resolve/reject:

const promise = new Promise((resolve, reject) => {
  console.log('Промис создан, но не завершен');
});

// Промис останется в состоянии 'pending'

Частые ошибки

  • Забывают вызывать resolve или reject, оставляя промис в состоянии 'pending'.
  • Путают порядок аргументов в функции-исполнителе (сначала resolve, потом reject).
  • Не обрабатывают ошибки в then/catch, что может привести к неожиданным последствиям.

Связанные темы

  • Цепочки промисов (Promise chaining)
  • Async/await как синтаксический сахар над промисами
  • Promise.all, Promise.race и другие комбинаторы промисов
  • Обработка ошибок в асинхронном коде

Follow-up вопросы

Что произойдет, если в функции-исполнителе не вызвать ни resolve, ни reject?

Уровень: basic

Промис останется в состоянии 'pending' (ожидание) навсегда, что может привести к утечке памяти, если на него есть подписки.

Можно ли передать в resolve/reject несколько аргументов? Как получить их в then/catch?

Уровень: intermediate

Нет, только первый аргумент будет передан. Остальные игнорируются. В then/catch принимается только один параметр (результат или ошибка).

Как обработать исключение (throw) внутри функции-исполнителя?

Уровень: intermediate

Любое исключение автоматически вызывает reject с этой ошибкой. Это эквивалентно обертке в try/catch.

Чем отличается new Promise от Promise.resolve()?

Уровень: advanced

Promise.resolve() создает уже resolved промис с переданным значением, а new Promise требует ручного вызова resolve/reject в исполнителе.

Какой будет порядок выполнения кода, если внутри исполнителя вызвать resolve синхронно?

Уровень: advanced

then/catch всегда выполняются асинхронно, даже если промис уже resolved. Код после resolve/reject продолжит выполняться синхронно до конца исполнителя.

Содержание