как вернуть масив с результатом вызова промисов?

Нужно написать асинхронную функцию PromiseAll, которая принимает массив промисов и возвращает массив результатов вызова этих промисов. Без использования метода promise.All Пример:

const firstPromise = new Promise((resolve) =>
  setTimeout(() => resolve(300), 300)
);

const secondPromise = new Promise((resolve) =>
  setTimeout(() => resolve(200), 200)
);

const thirdPromise = new Promise((resolve) =>
  setTimeout(() => resolve(100), 100)
);

promiseAll([firstPromise, secondPromise, thirdPromise])
    .then(console.log); // [300, 200, 100]

Ответы (2 шт):

Автор решения: Grundy
  1. Promise.all - возвращает новый Promise.
  2. Разрешается новый Promise - в момент, когда решились все переданные Promise.
  3. Если хотя бы один из переданных Promise отклонился, то и новый Promise так же отклоняется.

Исходя из этого можно построить следующую функцию:

function promiseAll(promises) {
  var count = promises.length; // количество ожидаемых Promise
  var result = new Array(count); // результат
  return new Promise((resolve, reject) => {
    for (let i = 0; i < promises.length; i++) {
      promises[i].then(val => { // если Promise решен
        result[i] = val; // сохраняем результа
        if (--count == 0) { // если больше нечего ждать
          resolve(result); // возвращаем результат
        }
      }, (err) => reject(err)); // если ошибка - прерываем основной Promise
    }
  });
}

const firstPromise = new Promise((resolve) =>
  setTimeout(() => resolve(300), 300)
);

const secondPromise = new Promise((resolve) =>
  setTimeout(() => resolve(200), 2000)
);

const thirdPromise = new Promise((resolve) =>
  setTimeout(() => resolve(100), 100)
);

promiseAll([firstPromise, secondPromise, thirdPromise])
  .then(console.log); // [300, 200, 100]

→ Ссылка
Автор решения: entithat

const firstPromise = new Promise((resolve) =>
  setTimeout(() => resolve(300), 300)
);

const secondPromise = new Promise((resolve) =>
  setTimeout(() => resolve(200), 200)
);

const thirdPromise = new Promise((resolve) =>
  setTimeout(() => resolve(100), 100)
);

function promiseAll(arr) {
  if (arr.length === 0) return Promise.resolve([]);
  const copy = [...arr]; // делаем копию, чтобы не изменить исходящий массив

  return new Promise((resolve, reject) => {
    let count = 0;
    for (let i = 0; i < arr.length; i++) {
      arr[i].then(res => {
        copy[i] = res;
        if (++count === arr.length) resolve(copy);
      }).catch(err => reject(err));
    }
  });
}

promiseAll([firstPromise, secondPromise, thirdPromise])
  .then(console.log) // [300, 200, 100]

promiseAll([])
  .then(console.log) // []
  .catch(console.log);

→ Ссылка