Sobes.tech
Назад к вопросам
Middle
1

Live coding: реализовать полифилл метода Promise.all, включая сохранение порядка результатов

Компании, где спрашивали
X-Notes

Ответ от нейросети

sobes.tech AI

Реализация полифилла для Promise.all должна принимать массив промисов и возвращать новый промис, который:

  • резолвится, когда все промисы из массива резолвятся,
  • реджектится, если любой из промисов реджектится,
  • сохраняет порядок результатов согласно порядку входных промисов.
function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(promises)) {
      return reject(new TypeError('Argument must be an array'));
    }
    const results = [];
    let completed = 0;
    const total = promises.length;

    if (total === 0) {
      return resolve([]);
    }

    promises.forEach((p, index) => {
      Promise.resolve(p)
        .then(value => {
          results[index] = value;
          completed += 1;
          if (completed === total) {
            resolve(results);
          }
        })
        .catch(err => {
          reject(err);
        });
    });
  });
}

Этот код обрабатывает как промисы, так и обычные значения (через Promise.resolve), аккуратно сохраняет порядок результатов и корректно обрабатывает ошибки.