Самостоятельная реализация функции, аналогичной Promise.all

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

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

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать свою функцию promiseAll, которая будет вести себя так же, как Promise.all. Требования к реализации:

  • Функция принимает массив промисов в качестве аргумента.
  • Если хотя бы один из переданных промисов завершится с ошибкой, функция должна вернуть отклонённый (reject) промис.
  • Если все переданные промисы успешно завершаются, функция должна вернуть выполненный (resolve) промис.
  • При успешном завершении порядок элементов в результирующем массиве должен соответствовать порядку исходных промисов.
  • При возникновении первой ошибки функция должна сразу отклонить результат, не ожидая завершения остальных промисов.

Ответ

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

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const values = Array.from(promises);
    const result = new Array(values.length);
    let remaining = values.length;
    if (remaining === 0) return resolve(result);
    values.forEach((value, index) => {
      Promise.resolve(value).then(item => {
        result[index] = item;
        if (--remaining === 0) resolve(result);
      }, reject);
    });
  });
}

Пустой массив сразу даёт выполненный Promise. Promise.resolve поддерживает обычные значения и thenable. Отклонение общего результата не отменяет оставшиеся операции; это учебный аналог для массива, без всех тонкостей подклассов Promise.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее