Какие проблемы решаются с помощью статических методов Promise в JavaScript
Что проверяют
Умеете ли вы управлять несколькими асинхронными операциями сразу: параллелить, ждать всех, брать первую или переживать частичные ошибки. Следом обычно дают задачу: загрузить три ресурса, не упав из-за одного, или добавить таймаут к запросу.
Как отвечать
Разложите методы по задачам, которые они закрывают:
Promise.all: параллельный запуск и ожидание всех. Результаты в порядке входного массива, при первой ошибке весь промис отклоняется. Решает типичную ошибку сawaitв цикле, когда независимые запросы идут последовательно;Promise.allSettled(ES2020): ждёт всех и возвращает объекты{ status, value }или{ status, reason }. Нужен, когда частичный отказ нормален, например у виджетов дашборда;Promise.race: результат первого завершившегося, успешного или нет. Классика: гонка запроса с таймером;Promise.any(ES2021): первый успешный. Если отклонились все, бросаетAggregateErrorсо списком причин. Подходит для запроса к нескольким зеркалам;Promise.resolveиPromise.reject: приводят значение или thenable к промису, чтобы функция всегда возвращала один тип;Promise.withResolvers(ES2024): отдаёт промис вместе сresolveиreject, удобно, когда завершение приходит из события или колбэка;Promise.try(ES2025): запускает функцию и превращает и синхронное исключение, и отклонение в один отклонённый промис.
Отдельно скажите об отмене: ни race, ни all не останавливают проигравшие операции. Запрос продолжит работать, пока вы не передадите в fetch сигнал от AbortController или AbortSignal.timeout().
Где спотыкаются
Пишут array.forEach(async ...) и ждут, что код дождётся всех. forEach промисы игнорирует, нужен Promise.all с map или for...of с await.
Запускают Promise.all на тысячу запросов разом и кладут бэкенд или упираются в лимит соединений браузера. Нужен пул с ограничением параллельности.
Не знают поведения на пустом массиве: all и allSettled сразу возвращают [], any отклоняется с AggregateError, а race не завершится никогда.