Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как обеспечить сохранение порядка результатов в кастомной реализации Promise.all при асинхронном выполнении промисов?

Вопрос проверяет понимание того, как гарантировать сохранение порядка результатов в кастомной реализации Promise.all при параллельном выполнении асинхронных операций.

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

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

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

Как сохранить порядок результатов в кастомной реализации Promise.all

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

Основная идея

Создаётся массив результатов с длиной, равной количеству промисов. Каждый промис при разрешении записывает свой результат в соответствующую позицию. После завершения всех промисов возвращается этот массив.

Пример реализации

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = new Array(promises.length);
    let completed = 0;

    promises.forEach((promise, index) => {
      Promise.resolve(promise)
        .then(value => {
          results[index] = value;
          completed++;
          if (completed === promises.length) {
            resolve(results);
          }
        })
        .catch(reject);
    });

    if (promises.length === 0) {
      resolve(results);
    }
  });
}

Как это работает

  • Массив results инициализируется с длиной, равной количеству промисов.
  • Каждый промис при успешном выполнении записывает результат в results[index], где index — позиция промиса в исходном массиве.
  • Счётчик completed отслеживает количество завершённых промисов.
  • Когда все промисы выполнены, массив results возвращается с сохранением порядка.

Вывод

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

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

#Promise.all

#async

#order

#custom implementation

#JavaScript

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию