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

Что такое Promise.resolve

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

Вопрос

Что такое Promise.resolve

Профессия

Frontend Developer

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

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

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

  • Promise.resolve — это статический метод, который возвращает Promise, разрешённый с переданным значением.
  • Если переданное значение уже является Promise, метод вернёт его без изменений.
  • Метод полезен для приведения любого значения к Promise, что упрощает работу с асинхронным кодом.
  • Пример использования: Promise.resolve(42) создаст Promise, который сразу разрешится со значением 42.

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

Promise.resolve — это статический метод объекта Promise, который создает и возвращает Promise, немедленно разрешающийся с переданным значением. Этот метод полезен для приведения любого значения к Promise, что упрощает работу с асинхронным кодом. Если переданное значение уже является Promise, метод вернет его без изменений. Это особенно удобно, когда вы не уверены, является ли значение Promise или нет, и хотите гарантированно работать с Promise.

Promise.resolve также может принимать thenable объекты (объекты с методом then). В этом случае Promise.resolve будет "разворачивать" thenable, вызывая его метод then, и возвращать новый Promise, который разрешится или отклонится в зависимости от результата thenable. Это позволяет интегрировать сторонние Promise-подобные объекты в стандартную цепочку Promise.

Метод часто используется для старта цепочек Promise, когда нужно начать с известного значения, или для оборачивания синхронных операций в Promise. Например, если функция должна всегда возвращать Promise, но иногда результат известен сразу, можно использовать Promise.resolve для соблюдения контракта.

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

Пример 1

Пример 1: Создание разрешенного Promise с числом

const p = Promise.resolve(42);
p.then(value => console.log(value)); // 42

Пример 2

Пример 2: Обработка thenable объекта

const thenable = {
  then: function(resolve) {
    resolve('resolved!');
  }
};
Promise.resolve(thenable)
  .then(value => console.log(value)); // 'resolved!'

Пример 3

Пример 3: Начало цепочки Promise

function fetchData() {
  return Promise.resolve()
    .then(() => fetch('/api/data'))
    .then(response => response.json());
}

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

  • Путаница между Promise.resolve и new Promise: некоторые кандидаты думают, что Promise.resolve(value) и new Promise((resolve) => resolve(value)) всегда эквивалентны, но разница проявляется при передаче thenable объектов.
  • Игнорирование случая, когда передается Promise: кандидаты иногда забывают, что Promise.resolve возвращает переданный Promise без изменений, что может привести к неожиданному поведению при работе с уже существующими Promise.

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

  • Promise.reject — статический метод для создания отклоненных Promise
  • Цепочки Promise (Promise chaining)
  • Обработка ошибок в Promise (catch/finally)
  • Async/await как альтернатива Promise

Follow-up вопросы

В чем разница между Promise.resolve(value) и new Promise((resolve) => resolve(value))?

Уровень: intermediate

Оба варианта создают разрешенный Promise, но Promise.resolve() более лаконичен и оптимизирован. Внутренне он может избежать создания лишнего микрозадания (microtask) в некоторых случаях.

Что произойдет, если передать thenable объект в Promise.resolve()?

Уровень: advanced

Promise.resolve() развернет thenable объект (объект с методом then), создав новый Promise, который будет следовать состоянию thenable. Это часть Promise assimilation механизма.

Можно ли использовать Promise.resolve() для создания цепочек Promise?

Уровень: basic

Да, Promise.resolve() часто используется как стартовая точка цепочки. Например: Promise.resolve().then(() => fetchData()).then(...). Это гарантирует, что последующие then/catch будут выполнены асинхронно.

Как Promise.resolve() ведет себя с undefined или без аргументов?

Уровень: basic

При вызове без аргументов или с undefined Promise.resolve() создаст Promise, разрешенный с undefined. Это полезно для начала цепочки без начального значения.

Когда стоит использовать Promise.resolve() вместо async/await?

Уровень: intermediate

Promise.resolve() полезен когда нужно явно создать Promise или обернуть синхронное значение. Async/await лучше для последовательностей асинхронных операций. Они дополняют друг друга и часто используются вместе.

Содержание