Какие аргументы принимает конструктор 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 продолжит выполняться синхронно до конца исполнителя.
Как узнать при выполнении нескольких Promise какие упали и какие выполнились
Разбор вопроса «Как узнать при выполнении нескольких Promise какие упали и какие выполнились» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Какие знаешь инструменты и механизмы работы с асинхронностью в JavaScript
Разбор вопроса «Какие знаешь инструменты и механизмы работы с асинхронностью в JavaScript» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.