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

Что возвращает конструктор Promise

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

Вопрос

Что возвращает конструктор Promise

Профессия

Frontend Developer

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

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

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

  • Конструктор Promise возвращает новый объект Promise, который находится в одном из трех состояний: pending, fulfilled или rejected.
  • Promise принимает функцию-исполнитель (executor) с двумя параметрами: resolve и reject, которые управляют состоянием Promise.
  • resolve(value) переводит Promise в состояние fulfilled с результатом value, а reject(reason) — в состояние rejected с причиной ошибки reason.

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

Конструктор Promise в JavaScript возвращает новый объект Promise, который представляет собой асинхронную операцию. Этот объект может находиться в одном из трех состояний: pending (ожидание), fulfilled (выполнено успешно) или rejected (выполнено с ошибкой). При создании Promise принимает функцию-исполнитель (executor), которая вызывается немедленно и получает два параметра: resolve и reject. Эти функции управляют состоянием Promise: resolve(value) переводит Promise в состояние fulfilled с результатом value, а reject(reason) — в состояние rejected с причиной ошибки reason. Promise позволяет структурировать асинхронный код, избегая так называемого 'ада колбэков' (callback hell).

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

Пример 1

Пример создания Promise и обработки его состояний:

const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Успешное выполнение');
  }, 1000);
});

myPromise

.then((result) => {
    console.log(result); // 'Успешное выполнение'
  })
  .catch((error) => {
    console.error(error);
  });

Пример 2

Пример обработки ошибки в Promise:

const errorPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(new Error('Что-то пошло не так'));
  }, 1000);
});

errorPromise

.then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error(error.message); // 'Что-то пошло не так'
  });

Пример 3

Пример цепочки вызовов .then():

const chainedPromise = new Promise((resolve) => {
  resolve(1);
});

chainedPromise

.then((value) => {
    console.log(value); // 1
    return value + 1;
  })
  .then((value) => {
    console.log(value); // 2
    return value * 2;
  })
  .then((value) => {
    console.log(value); // 4
  });

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

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

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

  • Цепочки вызовов .then() и .catch()
  • Микротаски (microtasks) и Event Loop
  • Promise.all(), Promise.race() и другие методы работы с несколькими Promise
  • Async/await как синтаксический сахар над Promise

Follow-up вопросы

Какие три состояния может иметь Promise?

Уровень: basic

Promise может находиться в одном из трех состояний: pending (ожидание), fulfilled (выполнено успешно) или rejected (выполнено с ошибкой).

Как работает цепочка вызовов .then() и .catch()?

Уровень: intermediate

.then() обрабатывает успешное выполнение Promise (fulfilled), а .catch() — ошибку (rejected). Они возвращают новый Promise, что позволяет строить цепочки.

Что такое микротаски (microtasks) и как они связаны с Promise?

Уровень: advanced

Microtasks — задачи с высшим приоритетом в Event Loop (например, коллбэки .then()). Promise использует их для асинхронного выполнения, что гарантирует порядок обработки.

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

Уровень: intermediate

new Promise создает новый объект с исполнителем, а Promise.resolve() сразу возвращает fulfilled Promise с переданным значением (или другим Promise).

Как обработать несколько Promise параллельно?

Уровень: intermediate

Используйте Promise.all() для ожидания всех Promise или Promise.race() для первого завершенного. Например: Promise.all([p1, p2]).then(...).

Содержание