> Как обрабатывать массив результатов промисов в 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.

Пример кода

JAVASCRIPT
const 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.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью