Как узнать при выполнении нескольких Promise какие упали и какие выполнились
Разбор вопроса «Как узнать при выполнении нескольких Promise какие упали и какие выполнились» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Вопрос
Как узнать при выполнении нескольких Promise какие упали и какие выполнились
Профессия
Frontend Developer
Что хочет услышать интервьюер
Интервьюер хочет убедиться, что кандидат понимает, как обрабатывать несколько асинхронных операций одновременно, и знает разницу между Promise.all и Promise.allSettled. Также важно, чтобы кандидат мог объяснить, как обрабатывать результаты выполнения Promise.
Ключевые тезисы
- Для работы с несколькими Promise одновременно можно использовать метод
Promise.allSettled. Он возвращает массив результатов всех переданных Promise, независимо от того, выполнились они успешно или завершились с ошибкой. - Каждый элемент массива результатов содержит объект с двумя свойствами:
status(состояние Promise: 'fulfilled' или 'rejected') иvalue(результат выполнения) илиreason(причина ошибки). - Пример использования
Promise.allSettled:Promise.allSettled([promise1, promise2]).then(results => { results.forEach(result => { console.log(result.status, result.value || result.reason); }); }); - Если важно обработать только успешно выполненные Promise, можно использовать метод
Promise.all, но он завершится с ошибкой, если хотя бы один Promise будет отклонен.
Подробный ответ
Для работы с несколькими Promise одновременно в JavaScript существует метод Promise.allSettled. Этот метод позволяет выполнить все переданные Promise и получить массив результатов, независимо от того, завершились они успешно или с ошибкой. Каждый элемент массива результатов представляет собой объект с двумя ключевыми свойствами: status и value или reason. Свойство status указывает на состояние Promise: 'fulfilled' (успешно выполнено) или 'rejected' (завершено с ошибкой). Если Promise выполнен успешно, результат будет доступен в свойстве value, а если произошла ошибка — причина будет указана в свойстве reason. Это особенно полезно, когда важно обработать все результаты, независимо от их состояния.
Метод Promise.all, в отличие от Promise.allSettled, завершается с ошибкой, если хотя бы один из переданных Promise отклонен. Это делает Promise.all менее гибким, если требуется обработать все результаты, включая ошибки. Однако, если важно получить только успешные результаты, Promise.all может быть полезен.
Для старых версий JavaScript, где Promise.allSettled не поддерживается, можно использовать альтернативные подходы, такие как создание собственной реализации с использованием Promise.all и дополнительной логики для обработки ошибок.
Пример использования Promise.allSettled демонстрирует, как можно получить и обработать результаты всех Promise, независимо от их состояния. Это особенно полезно в сценариях, где требуется собрать данные из нескольких источников, и важно учитывать как успешные, так и неудачные запросы.
Практические примеры
Пример 1
Пример использования `Promise.allSettled`: `Promise.allSettled([fetch('url1'), fetch('url2')]).then(results => { results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('Успешно:', result.value);
}
else {
console.log('Ошибка:', result.reason); } }); });`Пример 2
Пример обработки только успешных Promise с использованием `Promise.all`: `Promise.all([fetch('url1'), fetch('url2')]).then(results => { results.forEach(result => console.log('Успешно:', result)); }).catch(error => console.log('Ошибка:', error));`Пример 3
Пример реализации собственной версии `Promise.allSettled` для старых версий JavaScript: `function allSettled(promises) { return Promise.all(promises.map(promise => promise.then(value => ({ status: 'fulfilled', value }), reason => ({ status: 'rejected', reason })))); }`Частые ошибки
- Использование
Promise.allвместоPromise.allSettled, когда важно обработать все результаты, включая ошибки. - Отсутствие проверки свойства
statusв результатахPromise.allSettled, что может привести к попытке доступа к несуществующему свойствуvalueилиreason.
Связанные темы
- Асинхронное программирование в JavaScript
- Работа с массивами и коллекциями
- Обработка ошибок в Promise
Follow-up вопросы
Чем отличается Promise.allSettled от Promise.all?
Уровень: basic
Promise.allSettled ждет завершения всех Promise (успех/ошибка) и возвращает массив результатов. Promise.all завершается с ошибкой, если хотя бы один Promise отклонен, и возвращает массив значений только при успехе всех.
Как обработать только успешно выполненные Promise из массива результатов?
Уровень: intermediate
Используйте фильтрацию по статусу 'fulfilled': results.filter(r => r.status === 'fulfilled').map(r => r.value). Это даст массив значений успешных Promise.
Можно ли использовать Promise.allSettled для конкурентного выполнения запросов с ограничением?
Уровень: advanced
Нет, allSettled не поддерживает ограничение параллелизма. Для этого нужны дополнительные библиотеки (например, p-limit) или реализация через цепочки Promise с очередью.
Как получить индекс Promise в массиве, который завершился с ошибкой?
Уровень: intermediate
При обработке results можно использовать второй аргумент в forEach: results.forEach((result, index) => { if (result.status === 'rejected') console.log(index); });.
Какие альтернативы Promise.allSettled существуют для старых версий JS?
Уровень: basic
До ES2020 можно использовать полифил или реализовать аналогичную логику вручную через счетчик завершенных Promise и массив результатов.
Как скрипт подгружается с атрибутом defer
Разбор вопроса «Как скрипт подгружается с атрибутом defer» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Какие аргументы принимает конструктор Promise
Разбор вопроса «Какие аргументы принимает конструктор Promise» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.