> Как обрабатывать массив результатов промисов в JavaScript и выводить success или fail в консоль (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
Для обработки массива промисов с выводом success/fail используйте Promise.allSettled, который возвращает результаты всех промисов независимо от их статуса. Затем итерируйте массив и проверяйте status каждого результата: 'fulfilled' - success, 'rejected' - fail. Если нужно прерваться при первой ошибке, применяйте Promise.all с try/catch.
Подробное объяснение
Promise.allSettled - наиболее подходящий метод, когда требуется обработать все промисы и получить статус каждого. Он возвращает массив объектов с полями status ('fulfilled' или 'rejected'), value (для успешных) и reason (для отклонённых). Это гарантирует, что ни один промис не будет проигнорирован, и вы сможете вывести success/fail для каждого.
Promise.all завершится ошибкой при первом же rejected промисе, что может быть нежелательно, если нужно обработать все результаты. Promise.any возвращает первый успешный, игнорируя остальные. Promise.race - первый завершённый (любой статус). Выбор зависит от задачи: allSettled - для полного анализа, all - если критична любая ошибка.
На практике
На практике чаще всего используют Promise.allSettled для массовой обработки асинхронных операций, например, загрузки данных из нескольких API, где каждый запрос независим. Это позволяет логировать успешные и неудачные результаты без прерывания всего процесса. Если же требуется остановить выполнение при первой ошибке (например, в цепочке валидаций), применяют Promise.all с try/catch.
Пример кода
JAVASCRIPTconst promises = [fetch('/api/data1'),fetch('/api/data2'),fetch('/api/data3')];Promise.allSettled(promises).then(results => {results.forEach((result, index) => {if (result.status === 'fulfilled') {console.log(`Промис ${index + 1}: success`);} else {console.log(`Промис ${index + 1}: fail`);}});});
Как отвечать на собеседовании
Начните с упоминания Promise.allSettled как основного решения, объясните его преимущества перед Promise.all. Приведите пример сценария, где важно обработать все результаты. Если спросят про альтернативы, расскажите о Promise.all, Promise.any и Promise.race, указав их trade-off. Покажите понимание асинхронности и обработки ошибок в JavaScript.
Что проверяет интервьюер
Интервьюер оценивает знание методов работы с промисами, понимание их различий и умение выбирать правильный инструмент под задачу. Также проверяется способность объяснить практическое применение и избежать типичных ошибок, таких как игнорирование rejected промисов или неправильная обработка ошибок.
Типичные ошибки
- Использование
Promise.allбезtry/catch, что приводит к потере результатов успешных промисов при первой ошибке. - Путаница между
Promise.allSettledиPromise.all- непонимание, что первый не прерывается при reject. - Забывание обработать случай пустого массива промисов -
Promise.allSettledвернёт пустой массив, что корректно, но может быть неочевидно. - Неправильное чтение полей результата:
valueдля fulfilled,reasonдля rejected.
> Похожие задачи по frontend
Как обработать результаты двух асинхронных запросов с условиями success, fail и timeout в JavaScript?
Как обработать ошибку, если хотя бы один из нескольких запросов не ответил в JavaScript?
Как реализовать декоратор функции в JavaScript, ограничивающий число вызовов и вызывающий колбэк при последнем вызове
Что содержит this в обработчике события на кнопку в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью