Что возвращает конструктор 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(...).
Рядом с какими функциями можно писать await
Разбор вопроса «Рядом с какими функциями можно писать await» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Что выполняется первым: Promise или setTimeout
Разбор вопроса «Что выполняется первым: Promise или setTimeout» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.