Создание функции, аналогичной Promise.all

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

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

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

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

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

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

Условие

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

Ответ

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

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

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

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

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

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

Подробнее