Реализация собственного аналога Promise.all

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

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

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

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

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

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

Условие

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

function myPromiseAll(promisesArray) {
    // реализация
}

Пример использования:

myPromiseAll([p1, p2, p3]).then(results => {
    // обработка результатов
});

Ответ

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

function myPromiseAll(promisesArray) {
  return new Promise((resolve, reject) => {
    const items = Array.from(promisesArray);
    const results = new Array(items.length);
    let remaining = items.length;
    if (!remaining) return resolve(results);
    items.forEach((item, index) => Promise.resolve(item).then(value => {
      results[index] = value;
      if (--remaining === 0) resolve(results);
    }, reject));
  });
}

Promise.resolve нормализует обычные значения и thenable. Уже запущенные операции не отменяются после первой ошибки. Реализация покрывает заданный контракт массива; это не буквальный полифил всех правил стандарта для наследования Promise и статического this.

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

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

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

Подробнее