Какие состояния бывают у промисов и какие методы у них есть в JavaScript
Что проверяют
Знаете ли вы три состояния и понимаете ли, что переход необратим. Дальше обычно спрашивают про комбинаторы.
Как отвечать
Три состояния: pending (ожидание), fulfilled (исполнен со значением), rejected (отклонён с причиной). Промис переходит из ожидания ровно один раз и навсегда: повторный вызов resolve или reject ничего не меняет. Исполненный и отклонённый вместе называют settled.
Методы экземпляра:
- then(onFulfilled, onRejected): возвращает новый промис, поэтому цепочка это последовательность промисов, а не одного;
- catch(fn): сокращение для
then(undefined, fn); - finally(fn): выполняется в любом исходе, значение не меняет. Для снятия индикатора загрузки.
Статические:
- Promise.all: массив результатов, отклоняется на первой же ошибке, остальные операции при этом не отменяются;
- Promise.allSettled: дожидается всех, отдаёт статусы;
- Promise.race: первый завершившийся любым способом;
- Promise.any: первый успешный, отклоняется
AggregateError, если все упали; - Promise.resolve и reject: готовый промис;
- Promise.withResolvers: свежий способ получить промис вместе с его
resolveиreject.
Важные детали: обработчики всегда выполняются асинхронно, как микрозадачи; возврат промиса из then разворачивает его; необработанное отклонение всплывает как unhandledrejection.
Где спотыкаются
Считают, что промис может передумать и перейти обратно в ожидание.
Не возвращают промис из then и теряют последовательность.
Ставят catch перед then и не ловят ошибку следующего звена.
Путают all и allSettled.