Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: async, Promise, Promise.all, order, concurrency

Как реализовать сбор результатов асинхронных задач без потери порядка данных?

Вопрос проверяет понимание обработки асинхронных операций с сохранением исходного порядка данных, что критично для корректной работы пайплайнов обработки.

Короткий ответ

Для сохранения порядка результатов асинхронных задач нужно использовать Promise.all с массивом промисов. Промисы запускаются одновременно, но Promise.all возвращает массив результатов в том же порядке, в котором промисы были переданы. Это работает, потому что Promise.all не изменяет порядок разрешённых значений. Если порядок критичен, не используйте методы, которые возвращают результаты по мере готовности, например, Promise.race или циклы с await внутри.

Длинный ответ

При работе с несколькими асинхронными задачами (например, запросами к API или чтением файлов) часто требуется запустить их параллельно для производительности, но получить результаты в том же порядке, в котором задачи были инициированы. Это важно, когда порядок данных имеет смысл, например, при обработке списка элементов, где каждый элемент соответствует определённой позиции.

Решение с Promise.all

Стандартным решением является метод 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 и объединяет результаты в правильной последовательности.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#async

#Promise

#Promise.all

#order

#concurrency

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.