Создание собственного аналога Promise.all

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

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

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

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

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

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

Условие

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

const allPromise = () => {
  
}

allPromise(promises).then(response => console.log(response))

Ответ

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

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

Порядок результатов соответствует входу, а не скорости операций. Обычные значения также поддерживаются. После reject остальные операции сами не отменяются. Это учебный аналог для переданного набора, без специфики конструкторов-подклассов Promise.

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

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

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

Подробнее