Реализуйте полифил Promise.all: что он принимает на вход и как должен работать при успешном выполнении, ошибке и пустом массиве?

Promise.all принимает iterable значений/Promise, возвращает результаты в исходном порядке и отклоняется при первом отказе. Пустой вход даёт успешный Promise с [].

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

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

Promise.all принимает iterable значений/Promise, возвращает результаты в исходном порядке и отклоняется при первом отказе. Пустой вход даёт успешный Promise с [].

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

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

Promise.all принимает iterable значений/Promise, возвращает результаты в исходном порядке и отклоняется при первом отказе. Пустой вход даёт успешный Promise с [].

Учебная реализация без поддержки подклассов Promise:

function promiseAll(iterable) {
  return new Promise((resolve, reject) => {
    const results = [];
    let remaining = 1;
    let index = 0;
    for (const item of iterable) {
      const current = index++;
      remaining++;
      Promise.resolve(item).then(value => {
        results[current] = value;
        if (--remaining === 0) resolve(results);
      }, reject);
    }
    if (--remaining === 0) resolve(results);
  });
}

Promise.resolve нормализует обычные значения и thenables; ошибка обхода iterable отклоняет результат через executor. Отказ не отменяет уже запущенные операции, а порядок завершения не меняет индексы результата.

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

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

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

Подробнее