Вопрос проверяет умение эффективно обрабатывать несколько асинхронных HTTP-запросов одновременно, что критично для производительности веб-приложений.
В современных веб-приложениях часто требуется получить данные из нескольких независимых источников (например, пользовательский профиль, список заказов и уведомления). Выполнение этих запросов последовательно приводит к накоплению задержек, так как каждый следующий запрос ждёт завершения предыдущего. Параллельное выполнение позволяет отправить все запросы одновременно и обработать результаты, когда они все будут готовы, что сокращает общее время ожидания.
Стандартный способ — использовать встроенный метод Promise.all(). Он принимает итерируемую коллекцию (чаще всего массив) промисов и возвращает один промис. Этот результирующий промис выполнится, когда все переданные промисы успешно завершатся, и вернёт массив их результатов в том же порядке. Если любой из промисов будет отклонён, Promise.all немедленно отклоняется с причиной этой первой ошибки.
async function fetchMultipleUrls(urls) {
try {
// Создаём массив промисов-запросов
const promises = urls.map(url => fetch(url).then(res => res.json()));
// Ждём выполнения всех промисов параллельно
const results = await Promise.all(promises);
console.log('Все данные получены:', results);
return results;
} catch (error) {
console.error('Один из запросов завершился ошибкой:', error);
}
}
// Использование
const apiEndpoints = [
'https://api.example.com/users/1',
'https://api.example.com/posts?userId=1'
];
fetchMultipleUrls(apiEndpoints);Если важно получить результаты даже для частично неудачных запросов, используйте Promise.allSettled(). Он ждёт завершения всех промисов и возвращает массив объектов с статусом (fulfilled или rejected) и значением или причиной ошибки.
const promises = [
fetch('/api/data1'),
fetch('/api/data2'),
fetch('/api/invalid-endpoint') // Может завершиться ошибкой
];
const results = await Promise.allSettled(promises);
const successfulData = results
.filter(result => result.status === 'fulfilled')
.map(result => result.value);При работе с большим количеством запросов или ограниченным API может потребоваться ограничить параллелизм, чтобы не превысить лимиты сервера. Для этого можно использовать различные паттерны, например, разбивать массив на чанки или использовать готовые библиотеки (p-limit).
// Простой пример с ограничением в 2 одновременных запроса
async function fetchWithConcurrency(urls, limit) {
const results = [];
for (let i = 0; i < urls.length; i += limit) {
const chunk = urls.slice(i, i + limit);
const chunkResults = await Promise.all(chunk.map(url => fetch(url)));
results.push(...chunkResults);
}
return results;
}Вывод: Используйте Promise.all() для параллельного выполнения независимых REST-запросов, когда нужна максимальная скорость и все запросы критичны. При необходимости более гибкой обработки ошибок или ограничения нагрузки применяйте Promise.allSettled() или паттерны ограничения параллелизма.
Уровень
Рейтинг:
4
Сложность:
3
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Java Developer в телеграм