Что такое промисы в JavaScript и как они работают
Что проверяют
То же, что и вопрос про Promise: состояния, цепочки и обработка ошибок. Формулировка во множественном числе обычно означает, что интервьюер ждёт ещё и разговор про комбинаторы и async/await.
Как отвечать
Промис это объект с результатом операции, которая завершится позже. Состояния: ожидание, выполнен, отклонён; переход происходит один раз.
fetch("/api/jobs")
.then((res) => res.json()) // возвращает новый промис
.then((data) => render(data))
.catch((err) => showError(err))
.finally(() => hideLoader());Каждый then возвращает новый промис, поэтому звенья выстраиваются в цепочку, а брошенное исключение или отклонение «проваливается» вниз до ближайшего catch.
Комбинаторы для параллельных операций:
Promise.all: все успешно, иначе первая ошибка;Promise.allSettled: дождаться всех и разобрать статусы;Promise.race: первый завершившийся;Promise.any: первый успешный.
async/await это тот же механизм в синхронном на вид синтаксисе: функция с async всегда возвращает промис, await ждёт его разрешения, ошибки ловятся обычным try/catch.
По приоритету исполнения обработчики промисов это микрозадачи: они идут раньше setTimeout, но после текущего синхронного кода.
Где спотыкаются
Пишут await в цикле для независимых запросов и получают последовательное выполнение вместо параллельного.
Забывают return внутри then, и следующее звено получает undefined вместо результата.
Считают, что catch в конце цепочки поймает всё. Он поймает то, что было выше него, но не ошибки в обработчике самого catch и не то, что случится в finally.
Путают отклонение промиса и брошенное исключение в синхронной части: второе до промиса не доходит вовсе.