Что такое Promise в JavaScript и как он работает?
Что проверяют
Понимаете ли вы состояния промиса и то, что then возвращает новый промис. Отсюда вырастает разговор про цепочки, ошибки и async/await.
Как отвечать
Промис это объект, представляющий результат операции, которая ещё не завершилась. У него три состояния: ожидание, выполнен и отклонён. Переход происходит один раз и назад не отменяется.
const p = new Promise((resolve, reject) => {
setTimeout(() => resolve("готово"), 1000);
});
p.then((v) => console.log(v))
.catch((e) => console.error(e))
.finally(() => console.log("в любом случае"));Ключевое: then возвращает новый промис, поэтому вызовы выстраиваются в цепочку, а значение, возвращённое из обработчика, становится результатом следующего звена. Если из then вернуть промис, цепочка дождётся его.
Обработчики промисов это микрозадачи: они выполняются раньше setTimeout, но после текущего синхронного кода.
Комбинаторы, о которых спрашивают следом:
all: ждёт всех, падает при первой ошибке;allSettled: ждёт всех и отдаёт статусы, не падает;race: первый завершившийся, включая ошибку;any: первый успешный.
async/await это синтаксис над теми же промисами: await ждёт разрешения, try/catch заменяет catch.
Где спотыкаются
Забывают вернуть промис из then и получают цепочку, которая не ждёт вложенную операцию.
Ловят ошибку до асинхронной операции обычным try/catch вокруг вызова, который возвращает промис: без await туда ничего не попадёт.
Не знают, что необработанное отклонение в Node.js по умолчанию роняет процесс.
Ставят await в цикле там, где запросы независимы, и получают последовательное выполнение вместо Promise.all.