Вопрос проверяет понимание обработки асинхронных операций с сохранением исходного порядка данных, что критично для корректной работы пайплайнов обработки.
При работе с несколькими асинхронными задачами (например, запросами к API или чтением файлов) часто требуется запустить их параллельно для производительности, но получить результаты в том же порядке, в котором задачи были инициированы. Это важно, когда порядок данных имеет смысл, например, при обработке списка элементов, где каждый элемент соответствует определённой позиции.
Стандартным решением является метод Promise.all. Он принимает итерируемую коллекцию промисов (например, массив) и возвращает новый промис, который разрешится, когда все переданные промисы завершатся. Ключевое свойство: массив результатов сохраняет порядок исходных промисов, даже если некоторые промисы завершатся позже других.
async function fetchData(url) {
const response = await fetch(url);
return response.json();
}
const urls = ['/api/user/1', '/api/user/2', '/api/user/3'];
// Создаём массив промисов
const promises = urls.map(url => fetchData(url));
// Запускаем все и ждём результаты
const results = await Promise.all(promises);
// results[0] соответствует urls[0], results[1] — urls[1] и т.д.
console.log(results);Если нужно ограничить количество одновременно выполняемых задач (например, чтобы не перегрузить сервер), можно использовать паттерн пула с сохранением порядка. Один из способов — обрабатывать задачи параллельно группами, а затем собирать результаты.
async function runInOrder(tasks, concurrency) {
const results = [];
for (let i = 0; i < tasks.length; i += concurrency) {
const chunk = tasks.slice(i, i + concurrency);
const chunkResults = await Promise.all(chunk.map(task => task()));
results.push(...chunkResults);
}
return results;
}
// tasks — массив функций, возвращающих промисы
const tasks = [
() => fetch('/api/1'),
() => fetch('/api/2'),
// ...
];
const orderedResults = await runInOrder(tasks, 2);Вывод: Используйте Promise.all для параллельного выполнения асинхронных задач с сохранением порядка результатов. Если требуется контроль над количеством одновременных операций, реализуйте пул задач, который обрабатывает группы с помощью Promise.all и объединяет результаты в правильной последовательности.
Уровень
Рейтинг:
4
Сложность:
3
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Python Developer в телеграм